原题链接
思路
学习
将所有部门的人数从小到大排序
设可以组成cnt个部门
看一下有x个部门的人数>=cnt
剩下人数不足cnt的部门共有sum人
既然要组成cnt个部门,那么人数大于等于cnt的部门肯定要全用上,不可能说人数不足cnt还要还要组成cnt个部门。
那么接下来就看剩下的sum人,够不够组成cnt个部门,只要够补就不会出现人数会重复的情况(已经想了半天了,可是这一步还是没那么理解),可以通过画图来推
悟了,我悟了! 因为它是通过后一个更少的来补前一个少的,变短了就自动往后调,如果补不上就说明数量不够,数量够就一定补得上,可以通过改变组合顺序来实现。
啊啊啊我还是没太懂
111
#include<bits/stdc++.h>
#define int long longusing namespace std;const int N = 2e5 + 10;int a[N];int n, k;bool check(int x)
{
int sum = 0;//剩余人数 int cnt = 0;//有cnt个部门的人数大于x for (int i = 1; i <= n; i ++ ){
if (a[i] >= x) cnt ++;else sum += a[i];}if ((k - cnt) * x <= sum) return true;else return false;
}signed main()
{
cin >> n >> k;int maxn = 0;for (int i = 1; i <= n; i ++ ) {
scanf("%lld", &a[i]);maxn += a[i];}//需要注意二分范围 int l = 1, r = maxn / k;int ans = 0;while (l <= r){
int mid = (l + r) / 2;if (check(mid)) {
ans = mid;l = mid + 1;}else {
r = mid - 1;}}cout << ans << endl;return 0;
}