Google kickstart Round H 2020

尴尬,比赛看错了时间,把结束时间当成了开始时间了。

Retype

闯关游戏,一共有N关,当前在K关,需要回到S关,或者重新开始。

方法一:两个case取最小。

1
2
3
4
for case in range(1, int(input())+1):
N, K, S = map(int, input().split())
ans = K + min(N, N-K+(K-S)*2)
print_ans(case, ans)

Boring Numbers

12345,101010这样以奇数开头,并且奇偶交错的数叫无聊数。给你一个区间,求所有这种数的个数。

方法一:Lee215的方法。以N=3422为例,在7~9行循环中,分别加上了5**3表示1xxx2*5**2表示3[0|2]xx1*5**1表示341x,最后因为i%2==v%2打破奇偶交替,退出循环,因为342x不符合要求。随后11~12行循环用来计算[1, 9], [10, 99], [100, 999]的个数。由于每一位计算的时候没有算当前的,比如计算百位时,只算了0和2,这里相当于一个滞后的计算,所以末尾需要+1,也就是hi+1。最后相减即为结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def count(N):
"""
返回1~N的所有的无聊数,不包括N。
"""
res = 0
n = len(str(N))
for i, v in enumerate(map(int, str(N))):
res += (v + i%2) // 2 * 5 ** (n-i-1)
if i % 2 == v % 2:
break
for i in range(1, n):
res += 5 ** i
return res


for case in range(1, int(input())+1):
lo, hi = map(int, input().split())

a, b = map(count, (lo, hi+1))
print_ans(case, b-a)