Kolya and Movie Theatre - 洛谷
Problem - 1862E - Codeforces
解析:
可以观察到每次看电影所减少的舒畅值都和前一次有关,这样的话,可以发现减少的 d 只和最后一次看电影的时间有关。
所以枚举最后一次看电影的时间,并且维护一个优先队列,维护长度最长为m的数,如果大于m则不断弹出最小的数。
每次更新最大值。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int t,n,m,d,a[N];
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld%lld",&n,&m,&d);
int sum=0,res=0;
priority_queue<int,vector<int>,greater<int>>q;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(a[i]>0){
sum+=a[i];
q.push(a[i]);
while(q.size()>m){
auto p=q.top();
q.pop();
sum-=p;
}
if(sum-i*d>res) res=sum-i*d;
}
}
printf("%lld\n\n",res);
}
return 0;
}