codeforces C - Schedule Management

给出m个任务,n个人

m个工具由谁来做会更优

比如 1 2 3 3 2

第1个让1号员工做,花费1

第2个让2号员工做,花费1

第3个让3号员工做,花费1

第4个让3号员工做,花费1

如果员工和任务不匹配,花费2

一个很显然的贪心思路是尽可能地匹配,但是如果只是这样就写成了大模拟了..

你会发现很难写

(此时我看到了Bianry search的tag

灵机一动,显然答案满足单调性

那么二分,然后判断

在已经知道最大花费时间的情况下,一个人能做的任务是

(h-Hash[i])/2 (花费2的情况)  +  Hash[i]

求和然后判断是否>即可

前几天也有一道题很类似,就书架那题

也是用模拟做细节有亿点多,但如果二分+贪心可以很快解出来

>_<

复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
map<int,int>Hash;
bool check(int h){

    long long tot=0;
    for(int i=1;i<=n;i++){
    //    cout<<i<<" "<<Hash[i]<<endl;
        if(h-Hash[i]>=0){
        tot+=(h-Hash[i])/2;
        tot+=Hash[i];
        }
        else tot+=h;
    }
    //cout<<h<<" "<<tot<<endl;
    if(tot>=m) return true;
    else return false;
}
void solve(){
    cin>>n>>m;
    Hash.clear();
    for(int i=1;i<=m;i++) {
        int x;
        cin>>x;Hash[x]++;
    }
    int ans,l=1,r=(m/n)*2+7;
    while(l<=r){
        int mid=(l+r)/2;

        if(check(mid)){
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    cout<<ans<<endl;
}
int main(){
    //freopen("lys.in","r",stdin);
    
    int t;
    cin>>t;
    while(t--){
        solve( );    
    }
}
复制代码

 

posted @   liyishui  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示