以下是10道蓝桥杯Python真题的详细解析与代码实现,涵盖基础到进阶算法,所有代码均可直接运行:

(文章末尾可扫码加V)

  1. 攻击次数模拟(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

  1. 最长优美字符串(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

  1. 最长数字子串(第十二届国赛)
    题目描述
    输入字符串(如"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

  1. 充电站最少充电次数(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

  1. 拼正方形(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)

答案
根据输入参数计算最大边长

  1. 分解质因数(基础算法题)
    题目描述
    输入整数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

  1. 数位统计(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

  1. 剪绳子问题(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

  1. 本质上升序列(第十四届国赛)
    题目描述
    统计字符串中本质不同的严格递增子序列数量。
    解析思路
    动态规划+去重:记录每个字符首次出现的贡献。
    代码实现
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

  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、知乎等来源的详细解析。

更多推荐