abc227_d Project Planning

原题链接

思路

学习

将所有部门的人数从小到大排序
设可以组成cnt个部门
看一下有x个部门的人数>=cnt
剩下人数不足cnt的部门共有sum人
既然要组成cnt个部门,那么人数大于等于cnt的部门肯定要全用上,不可能说人数不足cnt还要还要组成cnt个部门。
那么接下来就看剩下的sum人,够不够组成cnt个部门,只要够补就不会出现人数会重复的情况(已经想了半天了,可是这一步还是没那么理解),可以通过画图来推

悟了,我悟了! 因为它是通过后一个更少的来补前一个少的,变短了就自动往后调,如果补不上就说明数量不够,数量够就一定补得上,可以通过改变组合顺序来实现。
啊啊啊我还是没太懂
在这里插入图片描述

111
请添加图片描述

#include<bits/stdc++.h> 
#define int long long

using 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;
}

Guess you like

Origin blog.csdn.net/qq_34682765/article/details/121545658