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( ); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)