E. Kolya and Movie Theatre

观察一下可以发现,d产生的消耗只与最后一次电影的观看位置有关。设1 <= i <= n,那么由d产生的消耗就是i * d。同时能从1 ~ i 中取得的回报是这段区间里最大的m个正数。用一个优先队列维护最大的m个正数,用val维护d产生的消耗与最大的m个正数产生的回报,记录所有位置的最大值,最后判断一下最大值是否大于0, 否则就执行一场电影都不看的策略,答案为0。遍历数组的时间为O(n),每次维护的时间为O(log m),总时间复杂度为O(n * log m)。

复制代码
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 void solve(){
 6     ll n, m, d;
 7     cin >> n >> m >> d;
 8     vector<ll> a(n);
 9     for(int i = 0; i < n; i++){
10         cin >> a[i];
11     }
12 
13     priority_queue<ll, vector<ll>, greater<ll>> que;
14     ll ans = 0;
15     ll val = 0;
16     for(int i = 0; i < n; i++){
17         if(a[i] > 0){
18             que.push(a[i]);
19             val += a[i];
20         }
21         while(que.size() > m){
22             val -= que.top();
23             que.pop();
24         }
25 
26         val -= d;
27         ans = max(ans, val);
28     }
29 
30     if(ans < 0){
31         ans = 0;
32     }
33     cout << ans << endl;
34 }
35 
36 int main(){
37     int t = 1;
38     cin >> t;
39     while(t--){
40         solve();
41     }
42 }
复制代码

 

posted @   KuriSh  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示