• 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;
    }
  • 相关阅读:
    11Java网络编程
    Java字节流与字符流
    10缓冲流、转换流、序列化流、Files
    JavaFile类和递归
    Java线程池 与Lambda
    Java多线程与线程同步
    5Java异常处理
    php base64数据与图片的转换
    PHP的json_encode中文被转码的问题
    设置MySQL允许外网访问
  • 原文地址:https://www.cnblogs.com/Accepting/p/12802056.html
Copyright © 2020-2023  润新知