一、美丽的2.
1. 考点:模拟
2. 难度:⭐
3. 要点分析:无。
import sys
import os
count = 0
for i in range(1,2020+1):
if '2' in str(i):
count += 1
print(count)
二、合数个数。
1. 考点:模拟、枚举
2. 难度:⭐
3. 要点分析:无。
import sys
import os
import math
count = 0
for i in range(4,2020+1):
for j in range(2, int(math.sqrt(i))+1):
if i%j==0 and j!=1:
count += 1
break
print(count)
三、阶乘约数。
1. 考点:数学——“约数个数定理”
2. 难度:⭐⭐⭐
3. 要点分析(详细解析可参考):代码本身不难,关键在于是否知道该定理。
【超详细】(蓝桥杯Python)阶乘约数:求100阶乘的正约数个数。_100的阶乘有多少个正约数-CSDN博客
import sys
import os
import math
# 寻找质数
zhishu = [2,]
for i in range(3,100+1):
word = 0
for j in range(2,int(math.sqrt(i))+1):
if i%j==0:
word = 1
break
if word!=1:
zhishu.append(i)
# 设定质数个数
count = [0]*len(zhishu)
# 寻找每个数的质数组合
for i in range(2,100+1):
num = i
j = 0
while num > 1:
if num%zhishu[j]==0:
count[j] += 1
num /= zhishu[j]
else:
j += 1
mul = 1
for i in range(len(count)):
mul *= (count[i]+1)
print(mul)
四、本质上升序列。
1. 考点:动态规划
2. 难度:⭐⭐⭐
3. 要点分析(详细解析可参考)(蓝桥杯第十一届决赛)试题D:本质上升序列(动态规划)_tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf-CSDN博客
import sys
import os
import math
s = """tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl"""
dp = [1]*len(s)
for i in range(len(s)):
for j in range(i):
if s[i] > s[j]:
dp[i] += dp[j]
elif s[i] == s[j]:
dp[i] -= dp[j]
print(sum(dp))
五、玩具蛇。
1. 考点:DFS
2. 难度:⭐⭐⭐
3. 要点分析
① 循环依据——基于盒子上的每个字母,A~P依次寻找路径。
② 终止条件——当遍历完盒子上的所有字母时。
③ 递归条件——基于可选择的4个方向,且移动的路线满足盒子的边界条件。
import sys
import os
import math
ans = 0 #数目统计
direction = [[1,0], [0,1], [-1,0], [0,-1]] #4个方向选择
flag = [[0]*4 for _ in range(4)]
def dfs(x, y, count):
global ans
# 终止条件
if count==16:
ans += 1
return
# 对4个方向进行搜素
for d in direction:
dx = x + d[0]
dy = y + d[1]
if 0<=dx<4 and 0<=dy<4 and flag[dx][dy]!=1:
flag[dx][dy] = 1 #标记
dfs(dx, dy, count+1) #基于该点继续搜索
flag[dx][dy] = 0 #上一条路径搜索完毕,消除痕迹
for i in range(4):
for j in range(4):
flag[i][j] = 1 #从盒子的不同起点开始依次搜索:A~P
dfs(i, j, 1)
flag[i][j] = 0 #取消上一次搜索的起点(以备下一次可选择)
print(ans)
六、天干地支。
1. 考点:模拟
2. 难度:⭐⭐
3. 要点分析
① 依据“天干”与“地支”的周期性,找到公元纪年里最小的“甲子年“。
2020%10==0 且 2020%12==4
即公元4年为年份最小的“甲子年”。
② 由此以“4”作为起点,对输入的年份从0开始,进行周期运算。
import sys
import os
import math
year = int(input())
tiangan = {1:"jia", 2:'yi', 3:'bing', 4:'ding', 5:'wu', 6:'ji', 7:'geng', 8:'xin', 9:'ren', 10:'gui'}
dizhi = {1:'zi', 2:'chou', 3:'yin', 4:'mao', 5:'chen', 6:'si', 7:'wu', 8:'wei', 9:'shen', 10:'you', 11:'xu', 12:'hai'}
left = 2020%12
year -= left
x = year%10+1
y = year%12+1
print(tiangan[x]+dizhi[y])
七、重复字符串。
1. 考点:思维、贪心
2. 难度:⭐⭐⭐⭐
3. 要点分析:换句话说,本题在于将序列划成k组,变更组内的元素,使得每组的内容相同。
import sys
import os
import math
k = int(input())
s = input()
ans = 0
"""
将序列分成了k份
每一份的内容都要相同
若字符串长度不为k的倍数 则无法修改
"""
if len(s)%k!=0:
print("-1")
else:
duration = len(s)//k
"""
在每列中 重复最多的字母不用修改 其余字母修改为重复最多的字母
一共可以划分为k组 每组有duration个元素
若按列再划分 一共有duration个组 每组有k个元素
"""
for i in range(duration):
ds = dict()
for j in range(k):
d = s[duration * j + i] #按列获取元素
if d not in ds: #在寻找元素中构建字典并计数
ds[d] = 1
else:
ds[d] += 1
ans += k-max(ds.values())
print(ans)
八、答疑。
1. 考点:贪心
2. 难度:⭐⭐⭐
3. 要点分析:本题的思考难点在于,如何进行“贪心”依据的选择。
在做此题之前,我纠结于参考的依据为“s+a”、“s+a+e”还是“s+a、s+a+e”(此部分可忽略)。
经过证明,可知:由所有局部最优解构成的解一定是全局最优解。
import sys
import os
import math
n = int(input())
s=[0]*n;a=[0]*n;e=[0]*n
for i in range(n):
s[i], a[i], e[i] = map(int, input().split())
# 计算每位同学的总用时
t = [0]*n
for i in range(n):
t[i] = a[i] + s[i] + e[i]
time = 0
time_collection = []
t_new = sorted(t)
index = [t.index(x) for x in t_new]
for i in range(len(t_new)):
time += t_new[i]
time_collection.append(time-e[index[i]]) #发消息的时间
print(sum(time_collection))