当前位置: 代码迷 >> 综合 >> abc227_d Project Planning
  详细解决方案

abc227_d Project Planning

热度:85   发布时间:2023-10-14 01:06:26.0

原题链接

思路

学习

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

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

111
abc227_d Project Planning

#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;
}
  相关解决方案