【python语言】第十一届蓝桥杯国赛 pyb组

一、美丽的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))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值