第十一届蓝桥杯省赛第一场真题【Python】

第十一届蓝桥杯省赛第一场真题【Python】

1.整除序列

在这里插入图片描述

n = int(input())

while n > 1:
    print(n,end=' ')
    n //= 2

print(1)

2.解码

在这里插入图片描述

s = input()
l = len(s)
ss = []
for i in range(0,l):
    if s[i].isdigit():
        for j in range(1,int(s[i])):
            ss.append(s[i - 1])
    else:
        ss.append(s[i])
for i in ss:
    print(i,end='')

3.走方格

在这里插入图片描述

n,m = map(int,input().split())
dp = [[0] * (m + 5) for i in range(0,n + 5)]

for i in range(1,n + 1):
    for j in range(1,m + 1):
        if i == 1 and j == 1:
            dp[i][j] = 1
        elif i % 2 == 0 and j % 2 == 0:
            dp[i][j] = 0
        else:
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
print(dp[n][m])

4.整数拼接

在这里插入图片描述

思路:

可以看出我们要找的是这样的数:

Aj*10lenAi+Ai % k == 0

也就是说Aj乘上10的len(Ai)次方除余k和Ai除于k的值加起来应该等于0或者k。

那么我们直接预处理一下,对于输入的每一个数字都算出他的乘上一个阶数除于k的值是多少,考虑到Ai的值最大可以到达1e9,所以一共需要1到10阶,我们一共需要10个字典(哈希)来存储。

n,k = map(int,input().split())
x = list(map(int,input().split()))
d = [dict() for i in range(0,11)]
for i in x:
    for j in range(1,11):
        if i * (10 ** j) % k in d[j]:
            d[j][i * (10**j) % k]+=1
        else:
            d[j][i * (10**j) % k] = 1
# print(d)
ans = 0
for i in x:
    l = len(str(i))
    if (k - i % k) % k in d[l]:
        if i * (10 ** j) % k == (k - i % k) % k:
            ans += d[l][(k - i % k) % k] - 1
            # 如果数和本身拼接起来也可以的话,那么要减去自身
        else:
            ans += d[l][(k - i % k) % k]
print(ans)

5.超级胶水

在这里插入图片描述

思路

思路1:

我们假设第一次合并任意挨着的两个石子a、b,那么需要的胶水是两个石子相乘a*b,然后得到重量为(a+b),在这之后继续合并的话,(a+b)还要乘上其他的石头,然后得到重量为(a+b+…),这样可以看出,每个石头都要乘一次之后的石头,而顺序先不管是先乘还是后乘不影响结果,所以我们可以直接从左往右合并。

扫描二维码关注公众号,回复: 13772741 查看本文章

思路2:

假如有两个石头a、b,它们合并的话需要胶水a*b,我们假设把所有的石子看成两个部分,把它们分别再看成两个部分,我们知道顺序是没有影响的,所以不管怎么合并,结果独都是一样的。

n = int(input())
m = list(map(int,input().split()))
ans = 0
sum = 0
for i in range(0,n - 1):
    sum += m[i]
    ans += sum * m[i + 1]
print(ans)

6.网络分析

暂无。

猜你喜欢

转载自blog.csdn.net/qq_45985728/article/details/123794198