D2. Magic Powder - 2

https://codeforces.com/contest/670/problem/D2

本来做的是D1,但是D2是增加了数据范围,那就直接剖析D2了。

题意:给定n个数的数组a和b,合成蛋糕需要n个元素,数组a代表了每个元素需要的数值,数组b表示现在每个元素有的数值。并且存在一个数值k,可以将k的任何数值补到b的任意位置上,但是使用的总量不能超过k。问最多可以合成多少蛋糕。

思路:一眼二分,O(n)*log(n)

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

    vector<int> a(n);
    vector<int> b(n);

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

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

    auto valid = [&](long long x) {
        long long need = 0;
        for (int i = 0; i < n; ++i) {
            need += (max(0ll, 1ll * a[i] * x - b[i]));
            if (need > k) {
                return false;
            }
        }
        return true;
    };

    long long l = 0, r = 2e9 + 5;
    while (l < r) {
        long long mid = (l + r + 1) >> 1;
        if (valid(mid)) {
            l = mid;
        }
        else {
            r = mid - 1;
        }
    }

    cout << l << '\n';
}
posted @ 2025-03-06 13:55  _Yxc  阅读(1)  评论(0编辑  收藏  举报