题解:B4207 [常州市程序设计小能手 2021] 战士

· · 题解

连续的若干次回合内显然优先磨刀,令在 m 回合内磨了 p 次刀则总伤害为 [\text{iA+dA}(m-p)]p-dp^2+(\text{iA+dA}m)p,它是一个二次函数,其最大值在 -\frac{b}{2a}\frac{\text{iA+dA}m}{2d} 处取到,由于二次函数的对称性离它最近的整数值就是取整时的最大值。直接模拟每轮能否一刀斩,能就输出,否则攒大招,同时模拟剩余血量,战士死亡时强制清空大招。注意特判 \text{dA=0} 时不要磨刀。

i,a,h,d,m=map(int,input().split());m=n=q=0
for j in map(int,input().split()):
    m+=1;q+=1;n+=j;o=int((a+m*d)/2/d)+(1 if(a+m*d)/2/d>.5+int((a+m*d)/2/d)else 0)if d else 1<<30
    if(a+d*(m-min(o,m)))*min(o,m)>=h:print(q);exit()
    if n>=i:h-=(a+d*(m-min(o,m)))*min(o,m);m=n=0
print(-1)