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