CF1862E

发布时间:2024年01月05日

洛谷题目链接

Codeforces题目链接

分析

注意到娱乐度的减少只跟最后看的电影有关,所以我们可以枚举最后看的电影的位置,对于每个电影若其欢乐值为负数则肯定不会选,如果选的数量大于 m m m 则把当前选的欢乐值最小的从答案中扣除,可以发现最后总的娱乐值为(设 t i t_i ti? 为选好的第 i i i 场电影的时间):

a 1 ? t 1 × d ? + a 2 ? ( t 2 ? t 1 ) × d ? + ? a m ? ( t m ? t m ? 1 ) × d a_1-t_1\times d\ + a_2-(t_2-t_1) \times d\ +\cdots a_m-(t_m-t_{m-1})\times d a1??t1?×d?+a2??(t2??t1?)×d?+?am??(tm??tm?1?)×d

d d d 提取出来原式就变为了:

a 1 + a 2 + ? a m ? ( t 1 + t 2 ? t 1 + ? t m ? t m ? 1 ) × d a_1+a_2+\cdots a_m-(t_1+t_2-t_1+\cdots t_m-t_{m-1})\times d a1?+a2?+?am??(t1?+t2??t1?+?tm??tm?1?)×d

可以发现 a 1 + a 2 + ? a m a_1+a_2+\cdots a_m a1?+a2?+?am? 即为 a 1 a_1 a1? a m a_m am? 的总和(记为 s u m sum sum), t 1 + t 2 ? t 1 + ? t m ? t m ? 1 t_1+t_2-t_1+\cdots t_m-t_{m-1} t1?+t2??t1?+?tm??tm?1? 即为 t m t_m tm?,所以最后原式即为: s u m ? t m × d sum-t_m\times d sum?tm?×d

最后用堆维护最小值,计算答案即可。

代码

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2 * 1e5 + 5;
int T, n, m, d, a[N];

signed main(){
	for(cin >> T; T; T --){
		priority_queue <int, vector <int>, greater <int> > q;
		cin >> n >> m >> d;
		int sum = 0, ans = 0;
		for(int i = 1; i <= n; i ++){
			cin >> a[i];
			if(a[i] > 0){
				q.push(a[i]);
				sum += a[i];
			}
			if(q.size() > m){
				sum -= q.top();
				q.pop();
			}
			ans = max(ans, sum - d * i);
		}
		cout << ans << "\n";
	}
	return 0;
}
文章来源:https://blog.csdn.net/zc2000911/article/details/135416620
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。