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];
}
}

浙公网安备 33010602011771号