C. Valhalla Siege
题意:有n个勇士一排排好,有血量,然后会有q次进攻,每次进攻都会扣勇士qi点血,如果勇士死了自动杀下一个,全死了将会在下一轮之前复活,要求输出每次进攻完之后剩了几个勇士
思路:二分加前缀和处理
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn=200008; int a[maxn],sum[maxn]; signed main() { int n,i,j,t,k,q; cin>>n>>q; for(i=1;i<=n;i++) { cin>>a[i]; } for(i=1;i<=n;i++) { sum[i]=sum[i-1]+a[i]; } int sum1=0; for(i=1;i<=q;i++) { int cx; cin>>cx; sum1+=cx; if(sum1>=sum[n]) { cout<<n<<endl; sum1=0; continue; } int l=1,r=n+1; while(r-l>1) { int mid=l+r>>1; if(sum[mid]>sum1) { r=mid; } else { l=mid; } } if(sum1<a[l]) cout<<n-l+1<<endl; else cout<<n-l<<endl; } } // 1 3 6 10 // 9 10 20 26 // 9 0 0 6