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';
}