1600*E. Kolya and Movie Theatre(贪心&优先队列&规律)

Kolya and Movie Theatre - 洛谷 

Problem - 1862E - Codeforces

1600*E. Kolya and Movie Theatre(贪心&优先队列&规律)_第1张图片

 1600*E. Kolya and Movie Theatre(贪心&优先队列&规律)_第2张图片

 1600*E. Kolya and Movie Theatre(贪心&优先队列&规律)_第3张图片

解析:

        可以观察到每次看电影所减少的舒畅值都和前一次有关,这样的话,可以发现减少的 d 只和最后一次看电影的时间有关。

        所以枚举最后一次看电影的时间,并且维护一个优先队列,维护长度最长为m的数,如果大于m则不断弹出最小的数。

        每次更新最大值。 

#include
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,greater>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;
}

 

你可能感兴趣的:(codeforces,算法,数据结构,c语言,c++,开发语言)