蓝桥杯2022 python C组

蓝桥杯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)

PS:不知道能不能过全部样例哈,应该可以优化一下,遍历到根号n就行

猜你喜欢

转载自blog.csdn.net/abc1234564546/article/details/128832069
今日推荐