题目链接: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;
}