CF1701C Schedule Management
做法
考虑二分答案,显然要二分完成所有任务的时间。
对于完成所有任务的时间 ,如何判断在 分钟内,所有任务可以做完呢?显然对于每一个工人所熟练的任务都有若干个,假设第 个工人所熟练的任务有 个,对于 ,第 个工人做完之后,还会继续做 个工作,而对于 ,这个工人会一直做下去,直到 分钟结束。
所以只需要判断这 分钟内,每个人多出的工作量,即对比 与每个人能额外做的工作量,即 的大小即可。
代码:
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int t, n, m, a[N];
inline bool check(int x)
{
int c1 = 0, c2 = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] < x) c1 += (x - a[i]) / 2;
else c2 += (a[i] - x);
}
return c1 >= c2;
}
signed main()
{
scanf("%lld", &t);
while (t--)
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= m; i++)
{
int x;
scanf("%lld", &x);
a[x]++;
}
int l = 0, r = 2 * m + 1;
while (l + 1 < r)
{
int mid = (l + r) >> 1;
if (check(mid))
{
r = mid;
}
else l = mid;
}
printf("%lld\n", r);
for (int i = 1; i <= n; i++) a[i] = 0;
}
return 0;
}

浙公网安备 33010602011771号