Educational Codeforces Round 131 (Rated for Div. 2)
基本情况
AB秒了。C知道是二分答案,check死活写不出来。
C. Schedule Management
错误分析
这题比较绕,搞了一个对应关系,大脑转不过来。
写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;
}