题目:E. Kolya and Movie Theatre
题目链接:https://codeforces.com/contest/1862/problem/E
思路:主要用优先队列存放大于0的元素,然后除了第一个数据后的每m个数据就可以存放到记录数组里面,最后遍历找价值最大的
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,d,a[200005],b[200005];
void solve()
{
priority_queue<int,vector<int>,greater<int> >q;
cin>>n>>m>>d;
for(int i=1;i<=n;i++) cin>>a[i];
int s=0,ans=0;
for(int i=1;i<=n;i++)
{
if(a[i]>0)
{
s+=a[i];
q.push(a[i]);
while(q.size()>m) s-=q.top(),q.pop();
}
b[i]=s;
}
for(int i=1;i<=n;i++) ans=max(ans,b[i]-d*i);
cout<<ans<<endl;
}
signed main()
{
int t;
scanf("%lld\n",&t);
while(t--) solve();
return 0;
}