题解:B4207 [常州市赛 2021] 战士
huhengrui2013 · · 题解
题解:B4207 [常州市赛 2021] 战士
传送门
思路:
思路其实挺好想,每当战士死亡之后,便进行一次计算,计算出在展示死亡前他所能给怪物造成的最大伤害。
那么最大伤害怎么算?我们可以枚举战士的磨刀次数
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;
}