題意:有一個n個怪物,環形排列,每個怪物有a[i]滴血,每次射擊可以-1滴血,死後爆炸產生b[i]傷害,能傷害到下一個怪物,若炸死了下一個,也是同樣爆炸,問最小射擊次數使得全部怪物GG
解題思路:
從反面思考,最終的結果是全部怪獸死亡,那麼造成的總傷害(爆炸+射擊)必然等於全部怪獸的血量和,那麼怎麼使得射擊的傷害儘可能小呢?毫無疑問是使得爆炸的傷害儘可能的大,那麼怎麼使得爆炸的傷害儘可能大呢?方法是儘量使每一次爆炸不要空(請你不要空大),我們只需確保空爆炸的次數不超過1就行了,取那次損失最小的空大。也就是最佳方案一定是,選擇一個最好的開始目標,射死這個接着射下一個直到全部死亡。那麼得到最佳答案,枚舉開始目標就行了。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=3e5+10;
ll t,n,a[maxn],b[maxn],c[maxn];
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
for(int i=1;i<=n;++i)
scanf("%lld%lld",&a[i],&b[i]);
ll sum=0;
for(int i=1;i<=n;++i)
{
if(i==1) c[i]=max(0ll,a[i]-b[n]);
else c[i]=max(0ll,a[i]-b[i-1]);
sum+=c[i];
}
ll ans=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=n;++i)
ans=min(ans,sum-c[i]+a[i]);
printf("%lld\n",ans);
}
return 0;
}