蓝桥杯 python 研究生组 备战刷题
动态规划
1. 奖杯排序
题目
难度:※※※※
学习点:
defaultdict
的使用可以设置字典的初始值,不用担心key不存在问题;
动态规划的难点是:如何定义dp数组的含义,以及考虑清楚每次的情况。
代码:
from collections import defaultdict
mod=10**9+7
N,K=map(int,input().split())
values=list(map(int,input().split()))
# 统计奖杯值v为结尾时,可能的等差k数列个数
dp=defaultdict(int)
# 不断统计奖杯值v出现的次数
cnt=defaultdict(int)
res=0
# 遍历每一个奖杯
for v in values:
# v为结尾的等差K数列有两种情况:
# 1. v前面v-k这个奖杯为结尾,后面再跟上一个v
# 2. v前面v-k这个奖杯为开头,后面再更上一个v
new=dp[v-K]+cnt[v-K]
dp[v]+=new
dp[v]%=mod
res+=new
res%=mod
cnt[v]+=1
print(res)
数学思维
1. 铺设地砖
题目
难度:※※※※※
学习点:
一个作弊点:基本上N是什么,就遍历什么
这里N是列,所以就遍历列
每一列有四种情况,蓝蓝,蓝白,白蓝和白白,因为出现白白机器人无法走到右下角,因此排除这种情况
我们统计每一列这三种情况下满足题目要求的规划方案,用a,b,c分别表示
先可以得出a b c的迭代公式;
然后发现b和c之间的关系;
然后我们要计算的是最后一列的情况也就是a+b,发现等于下一轮的c,经过一些替换后就得到了一个关于c的线性非齐次递推关系
用数值分析里面学过的方法来计算c即可
这里面有幂和除法取模,所以还用到了快速幂和费马小定理(虽然测试用例不用快速幂也可以通过)
这题非常非常非常难,每一步都很难,而且没学过数值分析求解递推关系的话,这题可能根本不会做
mod=10**9+7
# 快速幂(包含求模)
def quick_pow(a,b):
res=1
while b:
if b%2:
res=(res*a)%mod # 关键求模处
b//=2
a=(a*a)%mod # 关键求模处(这里没有的话,计算会非常慢)
return res
T=int(input())
for _ in range(T):
N=int(input())
if N%2==0:
t=-1
else:
t=1
res=(quick_pow(2,N+2)+t-3) % mod
# 费马小定理
res=(res*quick_pow(6,mod-2)) % mod
print(res)
模拟
1. 分布式队列
难度:※※
学习点:
简单题,但是有两个地方要注意
1 sync时不能盲目增加follow队列的元素个数,要检查此时follow队列是不是因为完全同步结束了
2 while循环输入里面要对输入进行异常捕捉,否则会出现段错误
N = int(input())
new_loc = [0 for _ in range(N)]
while True:
try:
operation = input().split()
op = operation[0]
if op != 'query':
id = int(operation[1])
if op == 'add':
new_loc[0] += 1
else:
if new_loc[id] < new_loc[0]:
new_loc[id] += 1
else:
print(min(new_loc))
except:
break