「QFOI R2」钟声远带斜阳 官方题解
考查内容:
- 【3】贪心法。
- 一维的前缀和与差分技巧。(可能算【3】递推法?)
首先试图找到周期数列
注意到,当且仅当
(一)先证当
显然,对于任意自然数
(二)再证当
设数列
任取
综上,当且仅当
至此,问题转化为最少花费多少代价,使得
将
const ll N = 1e5 + 5;
ll n, p, q, r, a[N];
cin >> n >> p >> q >> r;
for(ll i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1, a + 1 + n);
ll sum = accumulate(a + 1, a + 1 + n, 0LL);
if(sum >= 0) cout << 0 << endl;
else {
ll ans = 0;
for(ll i = 1; i < n; ++i) {
if(a[i] >= 0) break;
ll now = min(-a[i], -sum);
ll cost = min(p * now, q);
ans += cost;
sum += -a[i];
if(sum >= 0) break;
}
if(sum < 0) ans += p * (-sum);
cout << ans << endl;
}