1. 题目背景与核心逻辑解析
Megamind与Hal Stewart的战斗问题乍看像是一个简单的模拟题,但其中蕴含着巧妙的数学优化思想。我们先拆解题目中的关键要素:
- 能量机制:Hal Stewart有初始能量E,每次被击中减少P点能量
- 武器特性:Magic-48枪每把有K发子弹,打完后需要换弹
- 恢复机制:换弹期间Hal会恢复R点能量
- 胜负判定:当Hal能量≤0时立即被击败
这个问题的复杂性在于换弹期间的恢复机制打破了简单的线性伤害模型。如果直接模拟每次射击过程,对于E=1e5, K=1的情况需要循环1e5次,而题目要求处理1e5个测试用例,显然O(T*E)的暴力解法会超时。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键数学洞察与优化思路
2.1 战斗阶段分析
战斗过程可以分为两个明显不同的阶段:
- 首轮射击阶段:使用初始满弹匣,可以连续射击K次,期间不触发换弹恢复
- 循环射击阶段:之后每个"射击+换弹"周期包含:
- K次射击(造成K*P伤害)
- 1次换弹(恢复R能量)
- 净伤害:K*P - R
2.2 决定性条件判断
在编码前需要先判断几个关键条件:
- 一击必杀:当P ≥ E时,只需1次射击
- 首轮解决:当K*P ≥ E时,在首轮内即可解决,需要⌈E/P⌉次射击
- 无法击败:当K*P - R ≤ 0时,后续循环无法有效减少Hal能量
特别注意第三个条件:即使KP > R,但如果首轮射击后剩余能量E-KP ≤ 0,仍然可以在首轮解决,不应误判为无法击败。
2.3 数学推导过程
对于一般情况(需要进入循环阶段):
- 首轮射击后剩余能量:E' = E - K*P
- 每个完整循环净伤害:Δ = K*P - R
- 需要完整循环次数:n = ⌈E'/Δ⌉
- 最后一个不完整循环:
- 剩余能量:E' - (n-1)*Δ
- 换弹恢复R后:E'' = E' - (n-1)*Δ + R
- 需要射击次数:m = ⌈E''/P⌉
总射击次数 = K(首轮) + (n-1)*K(完整循环) + m(末轮)
3. 代码实现与边界处理
3.1 输入输出优化
由于T可达1
