专栏文章
题解:B4207 [常州市赛 2021] 战士
B4207题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @minw9nau
- 此快照首次捕获于
- 2025/12/02 09:23 3 个月前
- 此快照最后确认于
- 2025/12/02 09:23 3 个月前
题解:B4207 [常州市赛 2021] 战士
思路:
思路其实挺好想,每当战士死亡之后,便进行一次计算,计算出在展示死亡前他所能给怪物造成的最大伤害。
那么最大伤害怎么算?我们可以枚举战士的磨刀次数 ,已知上次战士复活时间到现在死亡时间的长度 ,那么攻击次数就是 ,磨刀 次的伤害就是 ,如果现在我们的攻击力已经大于怪物血量了,我们计算一下照现在的攻击力,怪物能承受几次就是 。然后取最小值并输出即可,若本回合不能击杀怪物,则取 的最大值,并让怪物血量减去即可。
AC Code:
CPP#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;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...