题解:B4207 [常州市赛 2021] 战士

· · 题解

题解:B4207 [常州市赛 2021] 战士

传送门

思路:

思路其实挺好想,每当战士死亡之后,便进行一次计算,计算出在展示死亡前他所能给怪物造成的最大伤害。

那么最大伤害怎么算?我们可以枚举战士的磨刀次数 k,已知上次战士复活时间到现在死亡时间的长度 len,那么攻击次数就是 len-k,磨刀 k 次的伤害就是 T = iA + k \times dA,如果现在我们的攻击力已经大于怪物血量了,我们计算一下照现在的攻击力,怪物能承受几次就是 \left \lfloor \frac{H}{T} \right \rfloor。然后取最小值并输出即可,若本回合不能击杀怪物,则取 T 的最大值,并让怪物血量减去即可。

AC Code:

#include<bits/stdc++.h>

using namespace std;

const int N=2e5+10;
int ih,ia,h,da,m,a[N],l=1,H,r=1;
int main(){
    cin>>ih>>ia>>h>>da>>m;
    for(int i=1;i<=m;i++) cin>>a[i];
    while(r<=m){
        H=ih;
        while(H>0&&r<=m) H-=a[r++];
        int len=r-l,sum=0,ans=1e9;
        for(int k=0;k<=len;k++){
            int T=ia+k*da;//磨刀k次后的单次攻击力
            if(T*(len-k)>=h){
                ans=min(ans,(int)(k+ceil(h/T)));
            }
            sum=max(sum,T*(len-k));
        }
        if(ans!=1e9){
            cout<<l+ans-1<<"\n";
            return 0;
        }
        h-=sum;
        l=r;
    }
    cout<<-1;
}