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

题意:n个曲子,ti时长,bi乐趣,最多选k首,得到使sum(ti)*min(bi)最大。
题解:bi排序,从大到小枚举,使当前bi为最小bi,从大于bi的曲子中选前k-1大。

#include<bits/stdc++.h>
using namespace std;

const int N=3e5+7;

typedef pair<int,int> pii;
typedef long long LL;
 
pii a[N];
multiset<int>se;
 
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].second>>a[i].first;
		//ti bi
	 } 
	 sort(a+1,a+n+1);
	 LL sum=0,ans=0;
	 for(int i=n;i>=1;i--)
	 {
	 	ans=max(ans,1LL*a[i].first*(a[i].second+sum));
	 	se.insert(a[i].second);
	 	sum=sum+a[i].second;
	 	if(se.size()==k)
	 	{
	 		sum=sum-*(se.begin());
	 		se.erase(se.begin());
		}
	 }
	 cout<<ans; 
	return 0;
}
#include<bits/stdc++.h>
using namespace std;

const int N=3e5+7;

typedef pair<int,int> pii;
typedef long long LL;
 
pii a[N];
priority_queue<int,vector<int>,greater<int> >q;
 
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].second>>a[i].first;
		//ti bi
	 } 
	 sort(a+1,a+n+1);
	 LL sum=0,ans=0;
	 for(int i=n;i>=1;i--)
	 {
	 	ans=max(ans,1LL*a[i].first*(a[i].second+sum));
	 	q.push(a[i].second);
	 	sum=sum+a[i].second;
	 	if(q.size()==k)
	 	{
	 		sum=sum-q.top();
	 		q.pop();
		}
	 }
	 cout<<ans; 
	return 0;
}

原文地址:https://www.cnblogs.com/zzyh/p/15253920.html