Circle of Monsters CodeForces

题目大意:有n个怪物,占成一个圈,然后每一一个怪物都有一定的生命值和爆破值,如果该怪物死了,那么会发生生爆炸会对下一个位置的怪物造成爆破值的伤害,没一发子弹可以打掉怪物1点生命值,问杀死这么多怪物,最少需要几发子弹。

题解:每个怪物有3种死法,第一种直接被子弹打死,第二种,直接被炸死,第三种,没炸死,然后补了几下又死了。首先我们可以枚举i,就是先让哪个怪物与发爆炸。然后再考虑下一个怪物,即需要补几下才能死。然后就这么一直下去,但是这样是n^2的复杂度。该怎么优化呢?可以用一个数组c来优化,c[i]表示当第i个怪物需要补几枪才能死掉,然后再求一下和sum。然后再枚举i,那么答案就是sum+a[i]-c[i]。求一下最小值就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e18+7;
const ll N=300000+7;
ll a[N],b[N];
ll c[N];
void solve(){
    ll n;
    cin>>n;
    for(ll i=1;i<=n;i++){
        cin>>a[i]>>b[i];
    }
    ll sum=0;
    for(ll i=1;i<=n;i++){
        if(i==1) c[i]=max((ll)0,a[1]-b[n]);
        else  c[i]=max((ll)0,a[i]-b[i-1]); 
        sum+=c[i];
    }
    ll ans=inf;
    for(ll i=1;i<=n;i++){
        ans=min(ans,sum+a[i]-c[i]);
    }
    cout<<ans<<endl;
}

int main(){
    ios::sync_with_stdio(0); 
    ll t;
    cin>>t;
    while(t--) solve();
    return 0;
}
原文地址:https://www.cnblogs.com/Accepting/p/12802056.html