[牛客小白月赛26]牛牛爱学习
牛牛爱学习
https://ac.nowcoder.com/acm/contest/6013/A
思路
我们可以看出,答案是具有单调性的,所以我们可以考虑二分答案。
我们排序后,按每一天进行安排,如果就退出循环。
Code:
#include<bits/stdc++.h> #define ll long long using namespace std; const int N = 1e6 + 5; ll n,m,a[N]; bool check(int x) { ll sum = 0; int t = 0; for(int i=1;i<=n;i++) { sum += (a[i] - t); if(i % x == 0) { t++; } if(a[i] - t <= 0)break; } if(sum >= m)return true; else return false; } int main() { scanf("%lld %lld",&n,&m); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } sort(a + 1,a + 1 + n,greater<ll>()); ll l = 1,r = n + 1,ans = 999999999; while(l < r) { ll mid = (l + r) / 2; if(check(mid))r = mid,ans = min(ans,r); else l = mid + 1; } printf("%lld",ans == 999999999 ? -1 : ans); return 0; }