C. The Delivery Dilemma

https://codeforces.com/problemset/problem/1443/C

题意:给长度为n的数组a和b,现在要从n个位置上各选一个数,可以从a或者b中挑选。如果从a中挑选,那么这些数是并行计时的,以最大的一个数计时到0为数值,如果从b中挑选,要累加计时,就是求和的数值。 现在问,在经过选择后,最小的计时是多少。

思路:二分,直接在答案域内二分,考虑当前的答案值能否满足要求,能满足就更新r,否则更新l。

总结:本来挺简单的题,搞的有点饶了,一开始也是做的二分,但是在二分后更新区间的时候,比较错了,使用了累加和最值去进行比较,错了,就应该直接跟答案比较,答案可以满足,就继续往下,不满足就往上。注释掉的是错误的思路。

inline void solve() {
    int n;
    cin >> n;

    vector<int> a(n), b(n);
    for (auto& x : a) {
        cin >> x;
    }

    for (auto& x : b) {
        cin >> x;
    }

    long long l = 0, r = 1e9;
    int ans = 1e9;
    while (l < r) {
        long long mid = (l + r) >> 1;
        long long other = 0, self = 0;
        for (int i = 0; i < n; ++i) {
            if (a[i] <= mid) {
                other = max<long long>(other, a[i]);
            }
            else {
                self += b[i];
            }
        }
        if (max(self, other) <= mid) {
            r = mid;
        }
        else {
            l = mid + 1;
        }
    }

    // long long other = 0, self = 0;
    // for (int i = 0; i < n; ++i) {
    //     if (a[i] <= l) {
    //         other = max<long long>(other, a[i]);
    //     }
    //     else {
    //         self += b[i];
    //     }
    // }
    // cout << max(other, self) << '\n';

    cout << l << '\n';
}
posted @ 2025-06-03 10:04  _Yxc  阅读(10)  评论(0)    收藏  举报