牛牛爱学习(贪心&二分)
思路:二分的练手好题,显然枚举的天数是有单调性的,然后就是贪心的计算天数为 的最大贡献,显然是从大到小取即可,每 个为一类,一开始减0,再减1知道某一个物品贡献小于等于0.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
int n,m,a[N];
bool fun(int x){
ll ans=0;
for(int i=0;i<n&&a[i]>i/x;i++) ans+=a[i]-i/x;
return ans>=m;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,greater<int>());
int l=1,r=n,ans=-1;
while(l<=r){
int mid=(l+r)>>1;
if(fun(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}