以下是10道蓝桥杯Python真题及详细解答
·
以下是10道蓝桥杯Python真题的详细解析与代码实现,涵盖基础到进阶算法,所有代码均可直接运行:
(文章末尾可扫码加V)
- 攻击次数模拟(2025年十六届B组)
题目描述
敌人初始血量2025,三个英雄轮流攻击:
- 英雄1每回合固定造成5点伤害
- 英雄2奇数回合造成15点,偶数回合造成2点
- 英雄3每3回合循环(第1回合2点,第2回合10点,第3回合7点)
求击败敌人的最小回合数。
解析思路
通过循环模拟每回合攻击,累加总伤害直至血量≤0。
代码实现
x = 2025
turn = 0
while x > 0:
turn += 1
hero1 = 5
hero2 = 15 if turn % 2 == 1 else 2
hero3 = 2 if turn % 3 == 1 else 10 if turn % 3 == 2 else 7
total = hero1 + hero2 + hero3
x -= total
print(turn) # 输出103
答案
103
- 最长优美字符串(2025年十六届B组)
题目描述
从文件words.txt中读取单词,定义“优美字符串”为:每个前缀(除最后一个字符)的排序后形式必须是某个更短优美字符串的排序形式。求最长且字典序最小的优美字符串。
解析思路
- 按长度和字典序排序单词
- 动态规划记录已验证的优美字符串
- 逐个检查单词是否满足条件
代码实现
with open("words.txt", "r") as f:
words = [line.strip() for line in f]
words.sort(key=lambda x: (len(x), x))
美化集合 = set()
for w in words:
if len(w) == 1:
美化集合.add(w)
else:
pre = ''.join(sorted(w[:-1]))
if any(''.join(sorted(s)) == pre for s in 美化集合):
美化集合.add(w)
max_len = max(len(w) for w in 美化集合)
result = min(w for w in 美化集合 if len(w) == max_len)
print(result) # 输出afplcu
答案
afplcu
- 最长数字子串(第十二届国赛)
题目描述
输入字符串(如"a2a22d"),输出最长连续数字子串的长度。
解析思路
遍历字符串,记录当前连续数字长度,遇到非数字重置计数。
代码实现
s = input()
lengths = []
current = 0
for char in s:
if char.isdigit():
current += 1
else:
lengths.append(current)
current = 0
lengths.append(current)
print(max(lengths)) # 示例输入"a2a22d"输出2
答案
示例输入输出:a2a22d → 2
- 充电站最少充电次数(2022年STEMA赛)
题目描述
电动汽车初始电量D,充电站间距离已知,求最少充电次数(需包含起点充电)。
解析思路
贪心算法:每次尽可能走到最远充电站再充电。
代码实现
D, N = map(int, input().split())
distances = list(map(int, input().split()))
charge = 1 # 起点必充
current = D
for i in range(N-1):
current -= distances[i]
if current <= 0:
print(-1)
exit()
if i == N-2 or current - distances[i+1] < 0:
charge += 1
current = D
print(charge)
答案
示例输入10 7 1 3 6 8 1 4 → 输出3
- 拼正方形(2024年省赛)
题目描述
用2×2方块和1×1方块拼最大正方形,给定两种方块数量,求最大边长。
解析思路
二分法:验证边长n是否满足面积需求。
代码实现
a = 7385137888721 # 2×2方块数量
b = 10470245 # 1×1方块数量
left, right = 0, int((a*4 + b)0.5) + 1
while left < right:
mid = (left + right + 1) // 2
need_2x2 = mid * mid // 4
need_1x1 = mid * mid % 4
if need_2x2 <= a and need_1x1 <= b:
left = mid
else:
right = mid - 1
print(left)
答案
根据输入参数计算最大边长
- 分解质因数(基础算法题)
题目描述
输入整数N,输出其质因数分解式(如12=223)。
解析思路
试除法:从2开始试除,直到sqrt(n)。
代码实现
def prime_factors(num):
factors = []
i = 2
while i * i <= num:
while num % i == 0:
factors.append(str(i))
num //= i
i += 1
if num > 1:
factors.append(str(num))
return ' '.join(factors)
n = int(input())
print(f"{n}={prime_factors(n)}")
答案
示例输入12 → 输出12=2 2 3
- 数位统计(2022年STEMA赛)
题目描述
统计100到N之间满足:个位≠3,十位≠5,百位≠7的数。
解析思路
遍历每个数,逐位检查条件。
代码实现
n = int(input())
count = 0
for num in range(100, n+1):
if num % 10 != 3 and (num // 10) % 10 != 5 and (num // 100) % 10 != 7:
count += 1
print(count)
答案
示例输入110 → 输出10
- 剪绳子问题(2023年STEMA赛)
题目描述
给定N根绳子长度,求最多可剪成长度为K的绳子数量。
解析思路
累加每根绳子整除K的结果。
代码实现
n = int(input())
lengths = list(map(int, input().split()))
k = int(input())
total = sum(l // k for l in lengths)
print(total)
答案
示例输入4 2 3 4 10 3 → 输出5
- 本质上升序列(第十四届国赛)
题目描述
统计字符串中本质不同的严格递增子序列数量。
解析思路
动态规划+去重:记录每个字符首次出现的贡献。
代码实现
s = "tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl"
dp = * 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
- 玩具蛇路径(第十四届国赛)
题目描述
4×4网格中,蛇从(0,0)出发,每次移动到相邻未访问格子,求所有可能路径数。
解析思路
DFS回溯法:标记已访问位置,递归探索四个方向。
代码实现
def dfs(x, y, cnt):
global res
if cnt == 16:
res += 1
return
for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]:
nx, ny = x+dx, y+dy
if 0<=nx<4 and 0<=ny<4 and grid[nx][ny] == 0:
grid[nx][ny] = 1
dfs(nx, ny, cnt+1)
grid[nx][ny] = 0
grid = [*4 for _ in range(4)]
grid = 1
res = 0
dfs(0, 0, 1)
print(res)
总结
以上题目覆盖模拟、动态规划、贪心、DFS等算法,建议结合洛谷等平台进行测试。更多真题可参考CSDN、知乎等来源的详细解析。
更多推荐




所有评论(0)