1 条题解

  • 8
    @ 2026-2-10 18:21:11

    由于发现没有人写这篇题解,于是勤劳的我特地奉上此题解! 前置知识:二分答案,优先队列

    最小电脑数量 容易想到使用二分答案,并且此题明显满足二分性(关于二分性是什么我在讨论中的“二分速通”有详细介绍)。地球人都应该明白此题无法使用动态规划,理由:此题答案无法用动态转移方程进行递推,那么搞定,此题就是二分答案!

    众所周知,二分答案要写 check 函数,本题的check函数也是十分好想,用 模拟 的思想,发现优先队列可以方便的利于本题的解题,最后挨个top掉并取最大值即为答案,check所得的值即为 当答案为x时,得到的结果是否满足题意,若满足,往大了继续求(因为题意是符合条件的情况下尽可能取最大),反之则往 小了求,最后得到的答案即为本题答案。

    代码附上,仅供参考!

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    int a[200005];
    int n,mx;
    bool check(int x){
        priority_queue<int>q;
        for(int i=1;i<=x;i++)q.push(-a[i]); 
        for(int i=x+1;i<=n;i++){
            int t=-q.top();q.pop();
            t+=a[i];q.push(-t);
        }
        int mxt=0;
        while(!q.empty()){
    		mxt=max(mxt,-q.top());
    		q.pop();
    	}
        return mxt<=mx;
    }
    signed main() {
    	ios::sync_with_stdio(false);
    	cin.tie(0);cout.tie(0);
        cin>>n>>mx;
        for(int i=1;i<=n;i++)cin>>a[i];
        int l=1,r=n,ans=n;
        while(l<=r){
            int mid=l+r>>1;
            if(check(mid)){
    			ans=mid;
    			r=mid-1;
    		}
            else{
    			l=mid+1;
    		}
        }
        cout<<ans<<"\n";
        return 0;
    }
    
    
    • 1

    信息

    ID
    39
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    435
    已通过
    29
    上传者