战斗属性的升级计划:堆调度¶
基于出题人的整除事件与防御单调性。GPT-6 将离线事件表改为每种敌人一个待处理事件的最小堆,降低事件存储空间。
方法¶
固定攻击升级次数 \(x\) 和防御次数 \(y\) ,敌人回合数为
总伤害为 \(\sum_i k_it_i\max(a_i-D_0-yV_D,0)\) ,所需生命为总伤害加一与 \(H_0\) 的较大者。攻击必须先达到能对每种敌人造成伤害的最小次数。
费用对防御次数离散凸;攻击提高时,额外防御节省的生命费用不增。因此从无伤防御起,只在严格变便宜时降低防御,一个始终左移的指针就能维护最优防御。费用相同时保留更高防御,因为这对应更少的生命。防御桶和精确大整数比较与主解法相同。
每种敌人至多保留一个事件。若当前回合数 \(t_i>1\) ,下一事件的攻击次数为
将 \((x_i',i)\) 放入最小堆。先评价初始可行攻击,再不断:
- 取堆中最小的攻击次数 \(x\) .
- 处理所有时间等于 \(x\) 的事件,更新对应敌人的回合数及防御桶。
- 每次处理后按新回合数计算该敌人的下一事件并入堆;回合数已为一则结束其事件链。
- 移动防御指针,再按 \((\text{费用},H,D,A)\) 更新答案。
初始防御已能完全阻挡的敌人不产生伤害事件,但其防御仍参与初始攻击下界。
正确性¶
事件公式由 \(t_i\) 首次下降所需的最小单回合伤害推得,严格晚于当前次数。因此每个敌人的事件链有序,堆始终给出所有敌人的最早未处理变化。处理完同一时刻的全部事件后,所有回合数恰好对应当前攻击。
没有事件的区间内,伤害与最优防御/生命不变,攻击单价为正,故只需区间最左端。防御的凸性和单调性保证指针取到每个候选攻击下的最优解,四元组比较保证全局最优和字典序。
同时攻击仍需计入敌人最后一击;生命必须为总伤害加一。桶值可超过 64 位,程序沿用两段整数和除法界限比较,不引入浮点误差。
复杂度与取舍¶
令 \(E=O(\sum_i\sqrt{h_i})\) ,最大防御次数为 \(Y\) .堆大小不超过 \(n\) ,总时间 \(O((n+E)\log n+Y)\) ,空间 \(O(n+Y)\) .无需分配攻击次数下标数组或同时保存全部事件。
与事件表相比,堆消除了 \(R+E\) 的存储项,但每次事件多了对数调度开销;不是对所有输入都更快。两种方案并列,均可通过当前完整范围;需要较少内存时可用本程序。
计算程序。