Codeforces Circle of Monsters(思維)

在這裏插入圖片描述

題意:有一個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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章