C. Sweets Eating

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

题意:给定n个糖果,每天最多只能吃m个。第k天吃第a[i]的糖果的代价是a[i] * k。现有n个询问,问吃i个糖果的最小代价是多少。(1 <= i <= n)

思路:对于第i个询问,选出数值最小的前i个糖果,然后排序,在天数靠前的时候,优先吃代价大的糖果,贪心策略,代价小的放到天数靠后的日子吃。

总结:只能想到暴力破解了,暂时没想到优化策略,有空了再补上。

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

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

    sort(a.begin(), a.end());

    for (int x = 1; x <= n; ++x) {
        auto b = vector<int>{a.begin(), a.begin() + x};
        sort(b.rbegin(), b.rend());
        int days = (x - 1) / m + 1;
        int j = 0;
        long long ans = 0;
        for (int i = 1; i < days; ++i) {
            for (int k = 0; k < m; ++k) {
                ans += 1ll * b[j++] * i;
            }
        }
        if (x - (days - 1) * m > 0) {
            int need = x - (days - 1) * m;
            for (int k = 0; k < need; ++k) {
                ans += 1ll * b[j++] * days;
            }
        }

        cout << ans << " \n"[x == n];
    }
}
posted @ 2026-01-13 10:29  _Yxc  阅读(2)  评论(0)    收藏  举报