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';
}
posted @ 2025-03-06 17:06  _Yxc  阅读(2)  评论(0编辑  收藏  举报