CF1862E Kolya and Movie Theatre 题解

先注意到我们娱乐值损耗的多少只与最后一场电影有关系,所以假设最后一场电影看的下标为 k,那么最后就要减去 d×k

得出这个性质之后开个小根堆反悔贪心即可,首先 ai<0 的没必要考虑,对于 ai>0 的,如果还没到 m 场电影,我们就直接往里塞就可以,如果到了,我们就进行反悔操作,取出已选的贡献最小的那场电影,然后看看会不会更优,如果会的话就加进去。

算是反悔贪心板子题,时间复杂度 O(nlogn)

然后就是一定要记得开 long long,吃了两发。

#include <cstdio> #include <queue> #include <algorithm> typedef long long ll; int t; int n,m,d; int a[200005]; void solve() { scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&d); for(int i=1;i<=n;i++) scanf("%d",&a[i]); std::priority_queue<int> q; int tot=0; ll ans=0,sum=0; for(int i=1;i<=n;i++) { if(a[i]<0) continue; if(tot<m) { tot++; q.push(-a[i]);//大根堆每次存相反数作用就是小根堆 sum+=a[i]; } else if(-q.top()<a[i]) {//反悔操作 sum+=q.top(); q.pop(); sum+=a[i]; q.push(-a[i]); } ans=std::max(ans,sum-1ll*d*i); } printf("%lld\n",ans); } } int main() { solve(); return 0; }

__EOF__

本文作者Scorilon
本文链接https://www.cnblogs.com/Scorilon/p/17666137.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Scorilon  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示