C. Schedule Management
https://codeforces.com/problemset/problem/1701/C
题意:n个worker跟m个任务,每个任务指定了哪个worker是精通它的。worker精通任务时,一个小时可以完成,否则需要两个小时。问完成所有任务最少需要多少个小时。
思路:一眼感觉有点贪心,肯定是优先把work分给精通的工人。但是什么时候把work分给不精通的工人呢?很难界定,只能先假定一个时间阈值,如果在这个时间阈值内某个工人不能完成所有精通的任务,才需要把这个任务分出去。反之,如果这个工人完成所有精通的任务还有时间,那么他就可以去干别的任务。到了这里,就是二分了。
总结:第一点是在第一时间没有把任务的上限估算好,算了个十次方级别的R,但是实际上最大时间应该是4E5。其次,在估算错时间后,美誉将lambada体内的两个变量改为longlong,运算溢出了。最后,在二分时,求的是更短的时间,所以应该是优先更新的R,但是第一次写的竟然是优先更新了L。。
inline void solve(){
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < m; ++i) {
int x;
cin >> x;
x --;
a[x] ++;
}
auto valid = [&](long long x) {
long long needTasks = 0;
long long hasTasks = 0;
for (int i = 0; i < n; ++i) {
if (x - a[i] >= 2) {
hasTasks += (x - a[i]) / 2;
}
else if (x - a[i] < 0) {
needTasks += a[i] - x;
}
}
return hasTasks >= needTasks;
};
long long l = 0, r = 1e10;
while (l < r) {
long long mid = (l + r) >> 1;
if (valid(mid)) {
r = mid;
}
else {
l = mid + 1;
}
}
cout << l << '\n';
}