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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章