1 条题解
-
8
由于发现没有人写这篇题解,于是
勤劳的我特地奉上此题解! 前置知识:二分答案,优先队列由 最小电脑数量 容易想到使用二分答案,并且此题明显满足二分性(关于二分性是什么我在讨论中的“二分速通”有详细介绍)。地球人都应该明白此题无法使用动态规划,理由:此题答案无法用动态转移方程进行递推,那么搞定,此题就是二分答案!
众所周知,二分答案要写 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
- 上传者