Superhero Battle
这道题卡了我一个多小时,最后也没有做出来,成功称为吊车尾。。。
思路什么的都没有问题,主要是,爆long long了,这个太可怕了,就因为一个中间变量忘记开longlong导致一直一直wa,心态都崩溃了
【思路分析】关键点:记录一轮攻击最多的地方,然后判断需要多少次才会让血量降低到撑不过一轮
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<climits>
using namespace std;typedef long long ll;ll H,n,tmp,ans,maxn=0,t;
const int MAXN=200005;
ll a[MAXN];int main()
{scanf("%lld%lld",&H,&n);a[0]=0;int flag=0;for(ll i=1;i<=n;i++){scanf("%lld",&tmp);a[i]=a[i-1]+tmp;if(a[i]<maxn){maxn=a[i];t=i;}if(a[i]+H<=0 && flag==0){flag=1;ans=i;}}if(flag==1){printf("%lld",ans);return 0;}if(a[n]>=0){printf("-1");return 0;}maxn=-maxn;ll kill=-a[n]; //忘记在这里开longlong ,然后一直在92个测试点错,卧槽ans=((H-maxn-1)/kill+1)*n; //使得H下降到maxn以下H=H-((H-maxn-1)/kill+1)*kill;//printf("test : %lld %lld\n",ans,H);int i=1;while(H+a[i]>0){ans++;//printf("test : %lld %lld\n",ans,H+a[i]);if(i==n){H+=a[n];i=1;}elsei++;}ans++;printf("%lld",ans);return 0;
}