牛牛爱学习

https://ac.nowcoder.com/acm/problem/205055

二分答案+贪心

思路:想要二分的找到最小需要看的天数的话,其实就应该要求出在一定天数间能获得的最大知识点。贪心策略就是优先看知识点数高的书。所以我们可以先将原序列按知识点从大到小排列,再按照看书天数将书分为不同集合。如:有序列为5,4,3,2,1的书要在2天看完,那么5,4就是每天看的第一本书,3,2就是每天看的第二本书,1就是第一天看的第三本书。

#include<bits/stdc++.h>
using namespace std;
int n, m, a[1000005];
bool cmp(int a, int b){
	return a>b;
}
bool check(int k){
	long long sum=0;
	for(int i=0; i<n; i++){
		if(a[i]-i/k<=0)break;
		sum+=a[i]-i/k;
	}
	if(sum>=m)
		return true;
	else 
		return false;
}
int main()
{
	cin>>n>>m;
	for(int i=0; i<n; i++)
		cin>>a[i];
	sort(a, a+n, cmp);
	int l=1, r=n;
	int ans=-1;
	while(l<=r){
		int mid=r-(r-l)/2;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}
		else
			l=mid+1;
	}
	cout<<ans;
	return 0;
}

 

posted @ 2020-06-28 08:57  TFLSNOI  阅读(185)  评论(0编辑  收藏  举报