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;
}
else
i++;
}
ans++;
printf("%lld",ans);
return 0;
}