1 条题解

  • 0
    @ 2026-5-5 21:28:37

    F. 最终 Boss – 详细题解

    问题重述

    你拥有 nn 种技能,第 ii 种技能每次造成 aia_i 点伤害,使用后需要冷却 cic_i 回合(即第 xx 回合使用后,下一次可用回合为 x+cix + c_i)。所有技能初始可用。每个回合你可以同时使用所有不在冷却中的技能。Boss 有 hh 点生命值,求击败 Boss 所需的最少回合数。

    关键观察

    由于技能使用是周期性的,第 ii 个技能在回合 tt 可用当且仅当 t1(modci)t \equiv 1 \pmod{c_i}(因为首次可用在回合 11,之后每隔 cic_i 回合一次)。更准确地说,在前 TT 回合中(T1T \ge 1),技能 ii 可使用的次数为:

    $$\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) $$

    显然 total(T)\text{total}(T)TT 的单调不减函数。我们要找到最小的 TT 使得 total(T)h\text{total}(T) \ge h

    解法:二分答案

    由于 nnhh 的最大值均为 2×1052\times 10^5,而 TT 可能很大(最坏情况 ai=1a_i = 1ci=2×105c_i = 2\times 10^5h=2×105h = 2\times 10^5,则 Thci=4×1010T \approx h \cdot c_i = 4\times 10^{10}),直接模拟不可行。采用二分法:

    • 下界 L=1L = 1
    • 上界 RR 可取一个足够大的数,例如 101510^{15} 或更精确地 hmax(ci)+1h \cdot \max(c_i) + 1。由于 h2×105h \le 2\times 10^5max(ci)2×105\max(c_i) \le 2\times 10^5,乘积不大于 4×10104\times 10^{10},所以 R=1015R = 10^{15} 是安全的。
    • 二分判断函数 check(T)\text{check}(T):计算 total(T)\text{total}(T),若 h\ge h 则返回真,否则假。注意计算过程中可能溢出 6464 位整数,可使用 __int128 或提前判断累加值已超过 hh 后立即返回(因为 hh 本身 2×105\le 2\times 10^5,累加时一旦达到 hh 就可停止,不会溢出,但为通用性仍建议使用 __int128 或直接使用 long long 注意上限:aia_i 最大 2×1052\times 10^5TT 最大 4×10104\times 10^{10},乘积 8×10158\times 10^{15},而 long long 最大值约 9.2×10189.2\times 10^{18},所以单次乘法不会溢出,但求和最多 nn 项,总伤害可能超过 long long,但由于 hh 很小,我们只需累加到 hh 即可,因此用 long long 完全安全,提前返回即可避免大数累加。
    • 二分结束后,LL 即为最小回合数。

    复杂度

    每个测试用例二分 O(logT)O(\log T) 次,每次判断 O(n)O(n),总复杂度 O(nlogT)O(n \log T)n2×105\sum n \le 2\times 10^5logT36\log T \approx 36,运行时间很短。

    注意点

    • 二分上界要足够大,确保答案在区间内。
    • 使用 6464 位整数或 __int128 防止中间计算溢出。
    • hh 很小时,答案可能为 11,二分需正确处理。

    示例验证

    例1h=3,n=2,a=[2,1],c=[2,1]h=3, n=2, a=[2,1], c=[2,1]

    • T=1T=1cnt1=1,cnt2=1\text{cnt}_1=1, \text{cnt}_2=1,总伤害 333 \ge 3 → 答案 11

    例2h=5,a=[2,1],c=[2,1]h=5, a=[2,1], c=[2,1]

    • T=2T=2cnt1=1,cnt2=1+(21)/1=2\text{cnt}_1=1, \text{cnt}_2=1+(2-1)/1=2,总伤害 2×1+1×2=4<52\times1 + 1\times2 = 4 < 5
    • T=3T=3cnt1=1+(31)/2=2\text{cnt}_1=1+(3-1)/2=2cnt2=1+(31)/1=3\text{cnt}_2=1+(3-1)/1=3,总伤害 4+3=754+3=7 \ge 5 → 答案 33

    与题目输出一致。

    结论

    本题通过二分答案并利用周期公式直接计算总伤害,避免了模拟每个回合,是解决这类“周期性攻击”问题的标准方法。注意数据范围和溢出处理即可。

    • 1

    信息

    ID
    6955
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者