Educational Codeforces Round 131 (Rated for Div. 2)

发布时间 2023-12-18 10:28:52作者: 加固文明幻景

基本情况

AB秒了。C知道是二分答案,check死活写不出来。

C. Schedule Management

Problem - C - Codeforces

错误分析

这题比较绕,搞了一个对应关系,大脑转不过来。

写check的时候完全想不出合理的思路。

很明显的要用桶来计数,但是怎么用不知道了。

看了题解后发现,check不能遍历任务来检测,而是通过遍历工人来检测。

正确思路

对于 check 函数,我们先记录每个工人所擅长的工作数量 \(cnt_i\)

然后我们贪心,如果有擅长的工作就先去做,经分析有以下两种情况。

  • 如果 \(x \le cnt_i\),那么他能完成 \(x\) 项工作(每项工作 \(1\) 小时)。
  • 否则,就先干擅长的 \(cnt_i\) 项,后干不擅长的 \(\lfloor\frac{x - cnt_i}{2}\rfloor\) (每项工作 \(2\) 小时)。

最后我们把干完的工作数量和 \(m\) 比较即可。

代码

bool check(int t)
{	
	long long sum = 0;
	for (int i = 1; i <= n; i++)
	{
		if (cnt[i] >= t) sum += t;
		else sum += cnt[i] + (t - cnt[i] >> 1);  
	}
	return sum >= m;
}

void solve()
{
	std::cin >> n >> m;
	memset(cnt, 0, sizeof(cnt));
	for (int i = 1; i <= m; i++) std::cin >> a[i], cnt[a[i]]++;
	int l = 1, r = m << 1, mid;
	while(l <= r)
	{
		mid = l + (r - l >> 1);
		if (check(mid)) r = mid - 1;
		else l = mid + 1;
	}
	std::cout << r + 1 << std::endl;
}