总体思路明确,但是犯了2个非常低级的错误。。。
1.判断错误条件一开始写的(mn>=0||d[n-1]>=0) 实际条件是mn>=0||(d[n-1]>=0&&H+mn>0
2.d[i]不是原来的伤害,而是从iter*n+0时刻开始到这个时候的一个总伤害值,在最后一次循环的伤害计算时犯错
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 800000
ll d[maxn];
int main(void){
ll H,n,ans;
cin>>H>>n;
ll mn=maxn;
d[0]=0;
for(ll i=0;i<n;i++){
ll cha;
cin>>cha;
if(i==0){
d[i]=cha;
}
else{
d[i]=d[i-1]+cha;
}
mn=min(d[i],mn);
}
if(mn>=0||(d[n-1]>=0&&H+mn>0)){
printf("-1\n");
return 0;
}
if(H>-1*mn){
ll iter;
if((H+mn)%(-1*d[n-1])==0){
iter=(H+mn)/(-1*d[n-1]);
}
else{
iter=(H+mn)/(-1*d[n-1])+1;
}
ll h0=H+d[n-1]*iter;
ll i;
for(i=0;i<n;i++){
// printf("i=%d,d[i]=%d\n",i,d[i]);
if(h0+d[i]<=0){
i+=1;
break;
}
}
ans=iter*n+i;
}
else{
ll h0=H;
ll i;
for(i=0;i<n;i++){
h0+=d[i];
if(h0<=0){
i+=1;
break;
}
}
ans=i;
}
printf("%lld",ans);
}