1 条题解

  • 0
    @ 2026-4-19 15:14:08

    E. 每秒伤害 详细题解

    题目核心理解

    你有 kk 个技能点,可以分配给单次伤害 xx每秒攻击次数 yy,满足:

    • x,yx,y 均为正整数
    • x+ykx+y \le k

    击杀第 ii 只怪物需要 hix\lceil \dfrac{h_i}{x} \rceil 次攻击,总攻击次数为:

    $$f(x)=\sum_{i=1}^n \left\lceil \frac{h_i}{x} \right\rceil $$

    总时间为 f(x)y\dfrac{f(x)}{y},即 f(x)kx\dfrac{f(x)}{k-x}

    目标:选择 xx 使得总时间最小,输出对应的 x,yx,y


    核心思路

    1. 关键性质

    • 忽略上取整时,Hx(kx)\dfrac{H}{x(k-x)} 是时间的下界,其最小值在 x=k2x=\dfrac{k}{2} 处。
    • 最优解几乎一定出现在 k/2k/2 附近很小的范围内
    • 远离中心点的 xx 可以直接用下界剪枝跳过,无需计算。

    2. 快速计算规则

    对给定 xx,计算 f(x)f(x) 的方式:

    • hh 降序排序。
    • 前一部分较大的值暴力累加
    • 后一部分值重复较多,用二分分段统计,避免 O(n)O(n) 遍历。

    3. 枚举规则

    • 从中心点 mid=k/2mid=k/2 开始,由近到远枚举 xx
    • 对每个 xx,先检查下界 Hx(kx)\dfrac{H}{x(k-x)},若已大于当前最优则直接跳过。
    • 否则计算真实时间,更新最优解。

    算法流程

    1. hh 数组降序排序,计算总血量 H=hiH=\sum h_i
    2. 设中心点 mid=k/2mid=k/2,以它为初始最优解。
    3. 按距离 midmid 从小到大枚举所有合法 x[1,k1]x\in[1,k-1]
    4. 对每个 xx
      • 若下界 Hx(kx)\dfrac{H}{x(k-x)} \ge 当前最优时间,跳过。
      • 否则分段计算 f(x)f(x),得到真实时间 g(x)=f(x)kxg(x)=\dfrac{f(x)}{k-x}
      • 若更优,则更新最优 xx
    5. 输出最优的 xxy=kxy=k-x

    公式与复杂度分析

    总攻击次数:

    $$f(x)=\sum_{i=1}^n\left\lceil\frac{h_i}{x}\right\rceil $$

    总时间:

    g(x)=f(x)kxg(x)=\frac{f(x)}{k-x}

    时间下界:

    g(x)Hx(kx)g(x)\ge \frac{H}{x(k-x)}

    复杂度

    • 排序:O(nlogn)O(n\log n)
    • 枚举 + 计算:O(nlognk)O(\sqrt{n\log n}\cdot k)
    • 总时间复杂度:O(nlogn+nlognk)O(n\log n + \sqrt{n\log n}\cdot k)

    可轻松处理 n,k2×105n,k\le 2\times 10^5hi1013h_i\le 10^{13} 的数据范围,在 55 秒时限内稳定通过。

    • 1

    信息

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