tokitsukaze and soldier(優先隊列、貪心)

在這裏插入圖片描述
解題思路:
由題目可知要求一個集合,使集合大小滿足元素的限制且元素之和最大。

一個顯然的貪心思想:在滿足條件的前提下使得和最大。要求和最大,就可以使用堆來維護。

因此,可以先按 ss 從大到小排序,維護一個小根堆,每插入新元素之前,將堆的大小調整至符合條件。再實時維護一個集合內元素的最大值即可。

時間複雜度:O(nlogn)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
priority_queue<ll,vector<ll>,greater<ll> > q;
vector<ll> ve[maxn];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		ll v,s;
		cin>>v>>s;
		ve[s].push_back(v);
	}
	ll sum=0,ans=0;
	for(int i=n;i>=0;--i)
	{
		for(auto c:ve[i])
		{
			sum+=c;
			q.push(c);
		}
		while(q.size()>i)
		{
			sum-=q.top();
			q.pop();
		}
		ans=max(ans,sum);
	}
	cout<<ans<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章