一、攻击次数
题目描述
小蓝操控三个英雄攻击敌人,敌人初始血量2025:
- 第一个英雄每回合固定攻击5点
- 第二个英雄奇数回合攻击15点,偶数回合攻击2点
- 第三个英雄根据回合数除以3的余数攻击:余1攻2点,余2攻10点,余0攻7点
游戏从第1回合开始,当敌人血量≤0时结束,求结束时的回合数。
解题思路
模拟战斗过程:
- 每个回合依次计算三个英雄的攻击总和
- 更新敌人血量并检查是否≤0
- 注意回合数需减1(回合从1开始计数)
代码实现
r = 2025
k = 1
while r > 0:
r -= 5
if k % 2 == 1:
r -= 15
else:
r -= 2
if k % 3 == 1:
r -= 2
elif k % 3 == 2:
r -= 10
else:
r -= 7
k += 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 = x
mx = 1
dd.append(x)
else:
t = ''.join(sorted(x[:-1]))
if t in v:
dd.append(x)
if m >= mx:
mx = m
ans = min([ans, x]) if m == mx else x
v.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 += 1
v[i-2:i+1] = [True]*3
print(ans)
五、A * B Problem
题目描述
计算满足X_AX_B + Y_AY_B ≤ L的正整数组合数。
解题思路
- 预处理乘积频次
- 使用前缀和优化查询
- 数学优化枚举过程
代码实现
def f2(l):
from math import isqrt
v = [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 = 0
j = i
while not vis[j]:
vis[j] = True
j = a[j]-1
cnt += 1
ans += 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 = 0
for i in range(n):
if (a[i] >> bit) & 1:
ans += (cnt0*i - sum0) * (1<<bit)
cnt1 += 1
sum1 += i
else:
ans += (cnt1*i - sum1) * (1<<bit)
cnt0 += 1
sum0 += i
print(ans)