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

猜你喜欢

转载自www.cnblogs.com/kickit/p/8978402.html