题目大意:有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; }