题目大意:
有 n个工人和 m 个任务,每个任务都有且仅有一个工人擅长做,如果让擅长做的工人去做,那么要花一个单位时间,否则要花两个单位时间。请问完成所有的任务至少要花多少时间。
注意:每项工作只能由一个工人完成,不能合作完成。
大体思路:
如果工人能尽快完成自己的人任务,则多出来的时间就是a[i]-mid
余下的工人,可以帮忙干活的为sum2 ,最后比较sum1,与sum2的关系,进行二分查找即可
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=200086;
int n,m,a[N],t,x;
long long sum1 ,sum2;
int main(){
cin>>t;
while(t--)
{
cin >> m>> n;
for(int i=1;i<=n;i++)
{
int k;
cin >> k;
a[k]++;
}
int l=1,r=n*2,mid;
while(l<=r)
{
mid=(l+r)/2;
sum1=sum2=0;
for(int i=1;i<=m;i++)
{
if(mid<=a[i]) sum1+=a[i]-mid;
else sum2+=(mid-a[i])/2;
}
if(sum1>sum2)l=mid+1;
else r=mid-1;
}
cout << l<<endl;
for(int i=1;i<=m;i++)a[i]=0;
}
}