蓝桥杯2022 python C组
跟之前的就四题不一样
第二题:特殊时间
就是i 从0-9,j从0-9 i是三个一样的,然后看看他们能不能成为 年 月日 时分
成为年只要大于0就好了,称为月日的话月要从1-12,日呢,特殊的日子就二月2829,但是如果你是2月28 29 的话前面那个就比如是22月,肯定不可能,所以不用考虑,最大也就2月22 ,还有31号,要31号的话只能是11月,但是11月没有31号,因此我们日子只要<31 就符合要求了
## 对于每三个数据和另一个数据我们为一个组合,例如1110为一个组合,找这个组合可以有多少种情况
## 把年 月日 时分 分开来讨论
numbers = [-1]*4
res = 0
for i in range(10): # 三个一样的
for j in range(10):
y,m,hs = 0,0,0 # 计每个有多少种可能
if i == j : continue
for k in range(4):
numbers[k] = j
numbers[(k+1)%4] = numbers[(k+2)%4] = numbers[(k+3)%4] = i # 每种排列都求一次
year = numbers[0]*1000 + numbers[1] * 100 + numbers[2] * 10+numbers[3]
months = hours = numbers[0]*10+numbers[1]
day = minute = numbers[2]*10+numbers[3]
if year > 0 : y += 1
if months > 0 and months < 13 and day > 0 and day < 31:m += 1
if hours > 0 and hours < 25 and minute >0 and minute < 60:hs += 1
res += y*m*hs
print(res)
第七题:GCD
这题是试着找规律找出来的。。你如果先遍历小的然后去试你会发现
100 21 在题目中的最大公约数是79 k = 58
101 21 在题目中的最大公约数是80 k = 59
100 79 在题目中的最大公约数是21 k = 5
101 79 在题目中的最大公约数是 22 k = 9
你会发现,如果最大公约数在min(a,b)和max(a,b)之间,那么k = 最大公约数-min(a,b)。这个时候我就感觉肯定是有规律的。然后我就想下面那种情况,当最大公约数 <min(a,b)的时候,你会发现 100 + 5 = 215 101+9 = 225。发现,哦,就是找到一个最小t 使得t最大公约数 > max(a,b),然后k = t最大公约数-max(a,b)
# gcd(a+k,b+k) 最大值为 abs(a-b)
# 当 max1 < min(a,b)时,k 为 max1*t > max(a,b) 的最小值t,然后k的值为 t*max1 - max(a,b)
# 当 min(a,b) < max1 < max(a,b)时, k = max1 - min(a,b)
if __name__ == '__main__':
a,b = map(int,input().split())
max1 = abs(a-b)
if a == max1 or b == max1 : print(0)
elif max1 < min(a,b) :
k = max(a,b)//max1 + 1
print(k*max1 - max(a,b))
else: print(max1 - min(a,b))
第八题:青蛙过河
先想一下其实过去和回来是一样的,要考虑回来的其实也可以考虑成过去的,因为怎么过去我们就怎么回来。所以我们只要想象成有2x个青蛙一起过河就好了。
那么想要2x个青蛙一起过河,要满足什么条件呢?设青蛙每次最多跳跃y个,我们要从第i个石头到第i+y个石头的承重之和要>= 2*x,这样才能保证青蛙每次跳跃都可以成功。然后用二分查找就好了
## 想象成有2x个青蛙过河
## 如果青蛙跳跃的最大能力是y ,那么代表石头从 i 到 i+y的前缀和应该大于等于 2*x
## 可以假设一下,如果有两只青蛙,最大跳跃能力是2 ,那么,a[1] + a[2] = 2 表示他们两个一定可以跳到前两个石头上面
## 然后有 a[2] + a[3] = 2 那么在石头1上的青蛙就可以跳到石头3,a[3]+a[4] = 2,石头2上的青蛙就可以跳到石头4或者石头3,
## 如果都在石头3,那么又有a[4]+a[5] >= 2 他们两个又可以跳到石头4和石头5,依次类推跳到对岸
def check(mid):
for i in range(1,n - mid +1): # i + mid <= n
if (b[i + mid - 1] - b[i-1] < 2*m): return False
else: return True
if __name__ == '__main__':
n,m = map(int,input().split()) # 宽度、能力
a = [int(x) for x in input().split()]
a = [10000]+a+[10000] # 首尾是岸上承受能力设很大
b = [0]*(n+1)
b[0] = a[0]
for i in range(1,n+1):
b[i] = b[i-1] + a[i] # 前缀和
## 二分查找
l,r = 1,n
while l < r:
mid = (l + r)//2
if (check(mid)):
r = mid
else : l = mid + 1
print(l)
第九题:因数平方和
考虑一下,从1 到n ,i的平方和会被乘以n//i次,那么就很简单了
## 从1到n i作为因子的个数为 n/i向下取整
if __name__ == '__main__':
MOD = 1000000007
n = int(input())
res = 0
for i in range(1,n+1):
k = n//i
res += i*i*k % MOD
res %= MOD
print(res)