1 条题解
-
0
F. 最终 Boss – 详细题解
问题重述
你拥有 种技能,第 种技能每次造成 点伤害,使用后需要冷却 回合(即第 回合使用后,下一次可用回合为 )。所有技能初始可用。每个回合你可以同时使用所有不在冷却中的技能。Boss 有 点生命值,求击败 Boss 所需的最少回合数。
关键观察
由于技能使用是周期性的,第 个技能在回合 可用当且仅当 (因为首次可用在回合 ,之后每隔 回合一次)。更准确地说,在前 回合中(),技能 可使用的次数为:
$$\text{cnt}_i(T) = 1 + \left\lfloor \frac{T-1}{c_i} \right\rfloor $$造成总伤害为:
$$\text{total}(T) = \sum_{i=1}^n a_i \cdot \left(1 + \left\lfloor \frac{T-1}{c_i} \right\rfloor\right) $$显然 是 的单调不减函数。我们要找到最小的 使得 。
解法:二分答案
由于 和 的最大值均为 ,而 可能很大(最坏情况 ,,,则 ),直接模拟不可行。采用二分法:
- 下界 。
- 上界 可取一个足够大的数,例如 或更精确地 。由于 ,,乘积不大于 ,所以 是安全的。
- 二分判断函数 :计算 ,若 则返回真,否则假。注意计算过程中可能溢出 位整数,可使用
__int128或提前判断累加值已超过 后立即返回(因为 本身 ,累加时一旦达到 就可停止,不会溢出,但为通用性仍建议使用__int128或直接使用long long注意上限: 最大 , 最大 ,乘积 ,而long long最大值约 ,所以单次乘法不会溢出,但求和最多 项,总伤害可能超过long long,但由于 很小,我们只需累加到 即可,因此用long long完全安全,提前返回即可避免大数累加。 - 二分结束后, 即为最小回合数。
复杂度
每个测试用例二分 次,每次判断 ,总复杂度 。,,运行时间很短。
注意点
- 二分上界要足够大,确保答案在区间内。
- 使用 位整数或
__int128防止中间计算溢出。 - 当 很小时,答案可能为 ,二分需正确处理。
示例验证
例1:
- :,总伤害 → 答案 。
例2:
- :,总伤害 。
- :,,总伤害 → 答案 。
与题目输出一致。
结论
本题通过二分答案并利用周期公式直接计算总伤害,避免了模拟每个回合,是解决这类“周期性攻击”问题的标准方法。注意数据范围和溢出处理即可。
- 1
信息
- ID
- 6955
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者