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( ); } }

浙公网安备 33010602011771号