一、攻擊次數
題目描述
小藍操控三個英雄攻擊敵人,敵人初始血量2025:
- 第一個英雄每回合固定攻擊5點
- 第二個英雄奇數回合攻擊15點,偶數回合攻擊2點
- 第三個英雄根據回合數除以3的余數攻擊:余1攻2點,余2攻10點,余0攻7點
游戲從第1回合開始,當敵人血量≤0時結束,求結束時的回合數。
解題思路
模擬戰斗過程:
- 每個回合依次計算三個英雄的攻擊總和
- 更新敵人血量并檢查是否≤0
- 注意回合數需減1(回合從1開始計數)
代碼實現
r = 2025
k = 1
while r > 0:r -= 5if k % 2 == 1:r -= 15else:r -= 2if k % 3 == 1:r -= 2elif k % 3 == 2:r -= 10else:r -= 7k += 1
print(k - 1)
二、最長字符串
題目描述
從單詞本中找出最長優美字符串:
- 長度為1時本身是優美字符串
- 長度>1時,存在前n-1個字符重組后的優美字符串
- 多個解時取字典序最小
解題思路
- 對單詞去重并按長度、字典序排序
- 維護優美字符串集合
- 動態驗證并更新最長結果
代碼實現
s = '''bbccbddbca'''
s = s.split('\n')
g = sorted(set(s), key=lambda x: (len(x), x))
v = set()
ans = ''
mx = -1
dd = []
for x in g:m = len(x)if m == 1:v.add(x)ans = xmx = 1dd.append(x)else:t = ''.join(sorted(x[:-1]))if t in v:dd.append(x)if m >= mx:mx = mans = min([ans, x]) if m == mx else xv.add(''.join(sorted(x)))
dd = sorted(set(dd), key=lambda x: (-len(x), x))
print(ans)
三、LQ圖形
題目描述
用字符Q繪制L型圖案:
- 豎筆劃寬度w,高度h
- 橫筆劃寬度v+w
解題思路
分兩部分構建:
- 豎部:h行,每行w個Q
- 橫部:w行,每行(v+w)個Q
代碼實現
w, h, v = map(int, input().split())
ans = []
for _ in range(h):ans.append(['Q']*w)
for _ in range(w):ans.append(['Q']*(v+w))
for row in ans:print(''.join(row))
四、最多次數
題目描述
從給定字符串s中切割最多數量的指定3字符組合(6種可能)。
解題思路
貪心策略:
- 滑動窗口遍歷字符串
- 遇到有效組合立即標記使用
- 跳過已使用字符
代碼實現
s = input()
n = len(s)
v = [False]*n
d = {'lqb','lbq','qlb','qbl','blq','bql'}
ans = 0
for i in range(2, n):if not v[i-2] and not v[i-1] and s[i-2:i+1] in d:ans += 1v[i-2:i+1] = [True]*3
print(ans)
五、A * B Problem
題目描述
計算滿足X_AX_B + Y_AY_B ≤ L的正整數組合數。
解題思路
- 預處理乘積頻次
- 使用前綴和優化查詢
- 數學優化枚舉過程
代碼實現
def f2(l):from math import isqrtv = [0]*(l+1)for i in range(1, l+1):for j in range(i, l//i +1):if i*j <= l:v[i*j] += 2 - (i==j)p = [0]*(l+1)for i in range(1, l+1):p[i] = p[i-1] + v[i]return sum(v[i] * p[l-i] for i in range(1, l+1))
print(f2(int(input())))
六、園藝
題目描述
保留最長的等間隔遞增樹列。
解題思路
動態規劃:
- dp[i][d]表示以i結尾、間隔d的最長序列
- 枚舉前驅樹更新狀態
代碼實現
n = int(input())
a = list(map(int, input().split()))
dp = [[1]*(n+1) for _ in range(n)]
for i in range(n):for j in range(i):if a[i]>a[j] and (d:=i-j):dp[i][d] = max(dp[i][d], dp[j][d]+1)
print(max(max(row) for row in dp))
七、書架還原
題目描述
通過交換操作將亂序書恢復順序,求最少操作次數。
解題思路
環分解:
- 每個環需要(環長-1)次操作
- 總次數=Σ(環長-1)
代碼實現
n = int(input())
a = list(map(int, input().split()))
vis = [False]*n
ans = 0
for i in range(n):if not vis[i] and a[i]!=i+1:cnt = 0j = iwhile not vis[j]:vis[j] = Truej = a[j]-1cnt += 1ans += cnt-1
print(ans)
八、異或和
題目描述
計算ΣΣ(a_i⊕a_j)*(j-i)的值。
解題思路
按位統計貢獻:
- 維護每位0/1的出現位置和
- 計算每位對最終結果的貢獻
代碼實現
n = int(input())
a = list(map(int, input().split()))
ans = 0
for bit in range(20):cnt0 = cnt1 = sum0 = sum1 = 0for i in range(n):if (a[i] >> bit) & 1:ans += (cnt0*i - sum0) * (1<<bit)cnt1 += 1sum1 += ielse:ans += (cnt1*i - sum1) * (1<<bit)cnt0 += 1sum0 += i
print(ans)