解题思路
由于解密只能一关关进行,而战斗只需要关卡解密已完成就可进行,因此问题简化为:
选择k关(x1⋅⋅⋅xkx_1 \cdot\cdot\cdot x_kx1 ⋅⋅⋅xk ),求∑i=1kxi\sum_{i=1}^{k} x_i∑i=1k xi 加上xkx_kxk 在解密时间上的前缀和的最小值。
建立前缀和数组sss存储解密时间前缀和,ttt数组用于存储每关的战斗时间(代码中为t_),sumsumsum变量用于存储堆中可能为最优的k关战斗时间和(代码中为sum_),ansansans变量用于储存当前最优解(代码中为ans_)。
先把前k关战斗时间加入sumsumsum变量和优先队列pqpqpq,此时最优解可表示为ans=s[k]+sumans = s[k]+sumans=s[k]+sum。遍历接下来每一关,若其战斗时间小于当前队列中最大战斗时间,则可能成为最优解选择关卡之一,将其与最大时间交换,若新时间的确较原先最优解更优,更新ansansans。
遍历完所有关卡后,ansansans即为最优解。
实际代码