给定n个工作者和m个任务
先将分配的m个任务集合存放数组a中
a[i]表示第i个工人所擅长的任务数量
随后我们可以遍历时间来算出当前时间能完成任务量之和与m的比较
假设时间为t
第t小时时第i个工人能完成的任务量num为分两种情况
t<=a[i] num=t
t>a[i] num=a[i]+(t-a[i])/2
这样所以工人的工作量之和就是总工作量sum
此时比较总工作量和任务量
当sum>=m时,则第t小时为答案
代码如下
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[200010];
int main()
{
int t,n,m;
cin>>t;
while(t--)
{
int nmax=0;
cin>>n>>m;
memset(a,0,sizeof a);
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
a[x]++;
nmax=max(a[x],nmax);
}
for(int i=1;i<=nmax;i++)
{
int sum=0;
for(int j=1;j<=n;j++)
{
if(a[j]>=i) sum+=i;
else sum+=a[j]+(i-a[j])/2;
}
if(sum>=m)
{
cout<<i<<"\n";
break;
}
}
}
}
PS:遍历t的最大值为nmax,即工人中最大工作量,想更快的话可以二分(反正我直接这样也能过)