https://codeforces.com/contest/1118/problem/D2
和easy version的主要区别是,数据增加了。
easy version采用的是线性查找,效率低
在这里采用binary search就可以了
#include<bits/stdc++.h> using namespace std; int n,m; vector<int> num; int C(int d){ int sum=0; for(int i=0;i<n;i++){ sum+=max(num[i]-i/d,0); if(sum>=m) return 1; } return 0; } int main(){ cin>>n>>m; num.resize(n); for(int i=0;i<n;i++){ cin>>num[i]; } sort(num.rbegin(),num.rend()); int l=1,r=n; while(r-l>1){ int mid=(l+r)>>1; if(C(mid)) r=mid; else l=mid; } if (C(l)) cout << l << endl; else if (C(r)) cout << r << endl; else cout << -1 << endl; return 0; }