Codeforce Educational Codeforces Round 131 (Rated for Div. 2) -C

 给定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,即工人中最大工作量,想更快的话可以二分(反正我直接这样也能过)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值