C. Vanya and Exams
https://codeforces.com/problemset/problem/492/C
题意:给定长度为n的数组a和b,以及一个上限值r和平均值ave。现在可以对a中的数字a[i]进行+1操作,且a[i]不能超过r,消耗b[i]的代价。问使得数组a的平均值不小于ave的最小代价是多少。
思路:计算出数组a需要增加的数值need,然后考虑每个位置距离r有多少次+1可以用,最后按数组b的代价大小非逆序排序,贪心的扫描一边即可。
总结,好久没有很快的A过题了。。原来秒切这么爽啊
inline void solve() {
int n;
cin >> n;
long long r, ave;
cin >> r >> ave;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) {
cin >> a[i] >> b[i];
}
long long need = ave * n - std::accumulate(a.begin(), a.end(), 0ll);
for (auto& x : a) {
x = std::max(0ll, r - x);
}
std::vector<int> pos(n);
std::iota(pos.begin(), pos.end(), 0);
std::sort(pos.begin(), pos.end(), [&](const int i, const int j) {
return b[i] < b[j];
});
long long ans = 0;
for (auto i : pos) {
if (need <= 0) {
break;
}
int now = std::min<long long>(need, a[i]);
ans += 1ll * now * b[i];
need -= now;
}
cout << ans << '\n';
}

浙公网安备 33010602011771号