cf Educational Codeforces Round 85

题目链接:https://codeforces.com/problemset/problem/1334/C
题目意思:有n个小怪兽围成一圈,第i个小怪兽有ai点体力值,爆炸之后会对下一个小怪兽产生bi点伤害(if i = n,下一个小怪兽为1 ),用子弹打一枪某个小怪兽,则小怪兽的体力值-1,问最少需要多少子弹,才能让所有小怪兽都死翘翘。
思路:假设每个小怪兽都爆炸了,那么打死小怪兽所需要的子弹数a[i] - bi-1,那我们只需要找到一个最小的子弹数(打死这个小怪兽需要的子弹数 - 前一个怪兽爆炸,打死这个小怪兽还需要的子弹数),然后俩者相加即可。

#include 
#include
using namespace std;
#define ll long long
const ll maxn = 4e6 + 10;
ll a[maxn] = {0}, b[maxn] = {0}, bullet[maxn] = {0};
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n, index = -1;
        ll minn = 1e18, chazhi = 1e18, sum = 0;
        memset(bullet, (ll)0, sizeof(bullet));//记得初始化,不然第25行会出错(当i=1时,若bullet不为0)
        scanf("%d", &n);
        for(int i = 1; i <= n; i++)
        {
            scanf("%lld%lld", &a[i], &b[i]);
            if(i > 1)
            {
                bullet[i] =max((ll)0, a[i] - b[i-1]);//bullet数组表示若前一个妖怪爆炸,这个妖怪还需要多少子弹才能爆炸
                sum += bullet[i];
            }
            chazhi =  min(chazhi, a[i] - bullet[i]);//chazhi表示  当前的妖怪只靠子弹打死 - 前面那个妖怪爆炸当前的妖怪还需要多少子弹数
        }
        bullet[1] = max((ll)0, a[1] - b[n]);
        sum += bullet[1];
        chazhi =  min(chazhi, a[1] - bullet[1]);
        printf("%lld\n", sum + chazhi);
    }
    return 0;
}

你可能感兴趣的:(CodeForces)