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;
}