牛牛爱学习(贪心&二分)

牛牛爱学习(贪心&二分)

传送门

思路:二分的练手好题,显然枚举的天数是有单调性的,然后就是贪心的计算天数为 x x 的最大贡献,显然是从大到小取即可,每 x x 个为一类,一开始减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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106905837