牛牛爱学习
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;
}

浙公网安备 33010602011771号