相关试题可以在洛谷上测试用例:
2025 十六届 蓝桥杯 Python B组
试题 A:攻击次数
答案:103
print(103)
代码:
# 初始化敌人的血量
x = 2025# 初始化回合数
turn = 0# 模拟攻击过程
while x > 0:# 回合数加一turn += 1# 第一个英雄的攻击hero1 = 5# 第二个英雄的攻击if turn % 2 == 1: # 奇数回合hero2 = 15else: # 偶数回合hero2 = 2# 第三个英雄的攻击if turn % 3 == 1: # 回合数除以 3 的余数为 1hero3 = 2elif turn % 3 == 2: # 回合数除以 3 的余数为 2hero3 = 10else: # 回合数除以 3 的余数为 0hero3 = 7# 总攻击值total = hero1 + hero2 + hero3# 更新敌人的血量x -= total# 输出游戏结束时的回合数
print(turn)
试题 B:最长字符串
答案:afplcu
print('afplcu')
将word.txt文件与你的python代码文件保存在同一个文件夹下:
# 读取 words.txt 文件中的单词
with open("words.txt", "r") as f:ws = [line.strip() for line in f]# 按长度和字典序排序
ws.sort(key=lambda x: (len(x), x))# 初始化优美字符串集合
bs = set()# 动态规划:判断每个单词是否是优美字符串
for w in ws:if len(w) == 1:bs.add(w)else:pre = ''.join(sorted(w[:-1]))if any(''.join(sorted(s)) == pre for s in bs):bs.add(w)# 找到最长的优美字符串
ml = max(len(w) for w in bs)
lbs = [w for w in bs if len(w) == ml]# 输出字典序最小的结果
print(min(lbs))
试题 C:LQ图形
代码:
w, h, v = map(int, input().split())for i in range(h):for j in range(w):print("Q", end = "")print()for i in range(w):for j in range(w + v):print("Q", end = "")print()
试题 D:最多次数
代码:
# 获取输入字符串
s = input()# 初始化计数器
count = 0# 遍历字符串,检查每个长度为3的子串
for i in range(len(s) - 2):substring = s[i:i+3]# 检查是否是目标模式之一if substring in {'lqb', 'lbq', 'qlb', 'qbl', 'blq', 'bql'}:count += 1# 为了避免重复计数,可以在找到一个模式后跳出当前循环break# 输出不同模式的数量
print(count)
试题 E:A · B Problem
代码:
# 读取输入的 L 值
L = int(input())
max_L = L # 最大范围为 L# 预处理每个数的约数数目
d = [0] * (max_L + 1) # 创建一个数组 d,用于存储每个数的约数数目
for i in range(1, max_L + 1):# 对于每个 i,将其所有倍数的约数计数加 1for j in range(i, max_L + 1, i):d[j] += 1# 计算前缀和数组
prefix_sum = [0] * (max_L + 1) # 创建一个数组 prefix_sum,用于存储约数数目的前缀和
current_sum = 0 # 当前的累积和
for i in range(1, max_L + 1):current_sum += d[i] # 累加当前数的约数数目prefix_sum[i] = current_sum # 将累积和存入前缀和数组# 计算总答案
total = 0 # 初始化总答案
for m in range(1, max_L + 1):remainder = L - m # 计算剩余值,即 L - mif remainder >= 0: # 如果剩余值非负,则可以继续计算# 累加满足条件的组合数# d[m] 表示 m 的约数数目,prefix_sum[remainder] 表示剩余值的约数数目的前缀和total += d[m] * prefix_sum[remainder]# 输出最终结果
print(total)
试题 F:园艺
代码:
def max_trees(n, heights):# dp[i] 是一个字典,表示以第 i 棵树为结尾时,不同间隔 d 对应的最长递增子序列长度dp = [{} for _ in range(n)]# 初始化:每棵树单独成一个子序列for i in range(n):dp[i][0] = 1 # 初始间隔为 0,长度为 1# 动态规划填表for i in range(n):for j in range(i):if heights[j] < heights[i]: # 只有当高度递增时才更新d = i - j # 计算间隔if d in dp[j]:dp[i][d] = max(dp[i].get(d, 1), dp[j][d] + 1)else:dp[i][d] = max(dp[i].get(d, 1), 2) # 至少长度为 2# 找到所有 dp[i][d] 中的最大值max_length = 1for i in range(n):if dp[i]:max_length = max(max_length, max(dp[i].values()))return max_length# 输入处理
n = int(input())
heights = list(map(int, input().split()))# 输出结果
print(max_trees(n, heights))
试题 G:书架还原
代码:
def func(n, a):visited = [False] * (n + 1) # 标记是否访问过,索引从 1 开始cycles = 0 # 环的数量for i in range(1, n + 1): # 遍历每本书if not visited[i]: # 如果未访问过cycles += 1 # 发现一个新的环x = iwhile not visited[x]: # 沿着环追踪visited[x] = Truex = a[x - 1] # 下一本书的位置(注意索引从 0 开始)return n - cycles # 最少操作次数# 输入处理
n = int(input())
a = list(map(int, input().split()))# 输出结果
print(func(n, a))
试题 H:异或和
代码:
n = int(input()) # 输入数组长度
a = list(map(int, input().split())) # 输入数组
res = 0 # 最终结果for b in range(31): # 遍历每一位(0到30位)m = 1 << b # 当前位的掩码,用于提取该位的值c = [0, 0] # 用于统计当前位为0和1的数量s = [0, 0] # 用于记录当前位为0和1的索引和cur = 0 # 当前位的贡献值for i in range(n): # 遍历数组中的每个元素bit = (a[i] >> b) & 1 # 提取当前元素在当前位的值(0或1)cur += c[1 - bit] * i - s[1 - bit] # 计算当前位的贡献值c[bit] += 1 # 更新当前位的计数s[bit] += i # 更新当前位的索引和res += cur * m # 将当前位的贡献值乘以掩码,累加到最终结果print(res) # 输出最终结果