C. Sagheer and Nubian Market

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

题意:给定n个物品,现在要购买这n个物品,购买时每个物品的代价是a[i] + i * k,其中k是实际购买的数量。给定初始金钱s,问s最多能购买多少个物品,相同的物品数量考虑最小的代价。

思路:在值域上二分,每次二分将所有物品根据当前的数量值对代价进行变更并排序,然后贪心的一次扫描,看能否满足当前值即可。

总结:真的好好读题了,但是为什么,理解出来的题意就是要购买连续的k个商品呢。。。

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

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

    long long cost = INF_LL;
    int ans = 0;
    auto valid = [&](int x) {
        auto b = a;
        for (int i = 0; i < n; ++i) {
            b[i] += 1ll * (i + 1) * x;
        }
        sort(b.begin(), b.end());
        long long sum = 0;
        int cnt = 0;
        for (int i = 0; i < x; ++i) {
            if (sum + b[i] > s) {
                return false;
            }
            sum += b[i];
            cnt ++;
        }
        if (checkMax(ans, cnt)) {
            cost = sum;
        }
        return true;
    };
    int l = 0, r = n;
    while (l < r) {
        int mid = (l + r + 1) >> 1;
        if (valid(mid)) {
            l = mid;
        }
        else {
            r = mid - 1;
        }
    }

    if (cost == INF_LL) {
        cost = 0;
    }
    cout << ans << ' ' << cost << '\n';

}
posted @ 2025-07-16 09:36  _Yxc  阅读(3)  评论(0)    收藏  举报