相關試題可以在洛谷上測試用例:
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) # 輸出最終結果