CF1140C Playlist(优先队列)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1140C Playlist(优先队列)相关的知识,希望对你有一定的参考价值。
每首歌形存成一个形如 { 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} bn−1作为最小的好听程度,显然 [ n − 1 , n ] [n-1,n] [n−1,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) 贪心+优先队列