CF1140C Playlist(优先队列)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1140C Playlist(优先队列)相关的知识,希望对你有一定的参考价值。

LINK

每首歌形存成一个形如 { t i , b i } \\{t_i,b_i\\} {ti,bi} p a i r pair pair,按照 b i b_i bi的大小进行小到大排序

考虑现在我们枚举 b n b_n bn作为最小的好听程度,显然只有第 n n n首歌满足条件

接下来我们枚举 b n − 1 b_{n-1} bn1作为最小的好听程度,显然 [ n − 1 , n ] [n-1,n] [n1,n]都是可选的

于是我们从这些歌曲选出 t t t值最大的前 k k k首歌即可

以此类推,我们枚举 b i b_i bi作为最小的好听程度,显然 [ i , n ] [i,n] [i,n]都是可选的

我们需要从中选出 t t t值最大的前 k k k首歌.若已经超过了 k k k首歌,就弹出一些 t t t值最小的歌曲

这个我们用一个优先队列就很好维护了

#include <bits/stdc++.h>
using namespace std;
#define fi first 
#define se second
#define int long long
const int maxn = 3e5+10;
int t,n,k;
typedef pair<int,int>p;
p a[maxn];
priority_queue<int,vector<int>,greater<int> >q;
signed main()
{
	cin >> n >> k;
	for(int i=1;i<=n;i++)	cin >> a[i].se >> a[i].fi;
	sort( a+1,a+1+n );
	int ans = 0, sum = 0;
	while( !q.empty() )	q.pop();
	for(int i=n;i>=1;i--)
	{
		while( q.size()>k-1 )	
		{
			int u = q.top(); q.pop(); 
			sum -= u;
		}
		q.push( a[i].se ), sum += a[i].se;
		ans = max( ans,a[i].fi*sum );
	}
	cout << ans << endl;
}
/*
在n个二元组,有属性t,b
注意到当要求的属性值a越低,就有更多的符合要求 
*/ 

以上是关于CF1140C Playlist(优先队列)的主要内容,如果未能解决你的问题,请参考以下文章

C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列

调度算法:时间片轮转优先级多级反馈队列

CF-div3-611-F. DIY Garland 优先队列 构造树

时间片轮转(RR)优先级调度算法以及多级反馈队列调度算法

时间片轮转(RR)优先级调度算法以及多级反馈队列调度算法

CF #374 (Div. 2) D. 贪心,优先队列或set