3 条题解

  • 1
    @ 2025-11-10 11:20:04

    贪心即可,考虑到通关的限制就是关卡中数值最大的敌人,我们先对所有敌人进行排序,根据题意模拟找出最大的数值即可。模拟过程中需要注意角色的数值仅需大于等于敌人,因此需要特判一下数值相等的情况。另外不开longlong见祖宗

    void solve(){
        ll n;cin>>n;
        vector<ll> a(n+1);
    
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        sort(a.begin()+1,a.end());
        ll tmp=0,ans=0;
        for(int i=1;i<=n;i++){
            if(tmp<a[i]){
                if(a[i]%10 == 0){
                    tmp=(a[i]/10);
                }
                else tmp=(a[i]/10)+1;
            }
            ans=max(tmp-i+1ll,ans);
        }
        cout<<ans<<endl;
    }
    

    然而本题考查本意为二分答案,也可以轻松解决,此处给出参考代码

    bool ok(ll L){
        ll atk = 10 + (L - 1) * 10; // 初始战力
        for(auto x : a){
            if(atk < x) return false; 
            atk += 10; // 打赢升级 +10
        }
        return true;
    }
    int n;
    vector<ll> a;
    void solve(){
        cin >> n;
        a.resize(n);
        for(int i = 0; i < n; i++) cin >> a[i];
        sort(all(a));
    
        ll l = 1, r = 1e17; // 上界很宽也没问题
        while(l < r){
            ll mid = (l + r) >> 1;
            if(ok(mid)) r = mid;
            else l = mid + 1;
        }
        cout << l;
    }
    

    信息

    ID
    1128
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    164
    已通过
    26
    上传者