codeforces 975C Valhalla Siege
题意:
有n个巫师站成一列,每个巫师有自己的血量。
一个人射箭攻击他们,每次造成若干点伤害,巫师按照给定的顺序承受伤害,如果伤害大了,那么死掉,伤害落到下一个巫师身上。
如果一轮攻击之后,所有的巫师都死了,那么他们会立即复活。
给出若干个询问,问每轮攻击之后还剩多少巫师活着。
思路:
前缀和加二分,每次伤害累加,大于了总和便归零且复活。
代码:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N = 2e5 + 10; long long pre[N],a[N]; int main() { int n,q; scanf("%d%d",&n,&q); for (int i = 0;i < n;i++) { scanf("%lld",&a[i]); } pre[0] = a[0]; for (int i = 1;i < n;i++) pre[i] = a[i] + pre[i-1]; long long ans = 0; for (int i = 0;i < q;i++) { long long b; scanf("%lld",&b); ans += b; if (ans >= pre[n-1]) { printf("%d\n",n); ans = 0; } else { int pos = lower_bound(pre,pre+n,ans) - pre; long long gg = pre[pos]; int tt = 0; if (gg == ans) { tt = n - pos - 1; } else { tt = n - pos; } printf("%d\n",tt); } } return 0; }
康复训练中~欢迎交流!