5.29 VJ D - Circle of Monsters

#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
/*题意:有n个怪物排成一圈,每个怪物有ai的血量,当它血量为0可爆炸并减小下一个怪物bi的血量,一发子弹打掉一滴血,最少用几发子弹。
就是找到一个合适的位置打怪物,利用爆炸使怪物掉血。
先算出每个怪物死后爆炸可以使下一个剩多少血量,依次存入数组s并求和
sum-s[i]+a[i](因为第i个没有上一个爆炸带来的伤害,还要加上杀死它需要的子弹)就是总共要花费的子弹数
eg:
i a  b  s  sum-s[i]+a[i]
0 7 15  4    4-4+7=7
1 2 14  0    4-0+2=6
2 5 3   0    4-0+5=9
sum=4
取sum-s[i]+a[i]最小值
*/
const int N=1e6;
ll a[N],b[N],s[N];
int  main( )
{
    speed_up;
    ll t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        ll sum=0,minn=1e18;
        for(int i=0; i<n; i++)
        {
            cin>>a[i]>>b[i];
            if(i>0)
            {
                s[i]=max((ll)0,a[i]-b[i-1]);
                sum+=s[i];
            }
        }
        s[0]=max((ll)0,a[0]-b[n-1]);
        sum+=s[0];
        for(int i=0; i<n; i++)
        {
            minn=min(minn,sum-s[i]+a[i]);
        }
        cout<<minn<<endl;
    }
}
posted @ 2020-05-29 16:18  SyrupWRLD  阅读(116)  评论(0)    收藏  举报