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;
}
发布了165 篇原创文章 · 获赞 11 · 访问量 4885

猜你喜欢

转载自blog.csdn.net/weixin_43784305/article/details/105128873
今日推荐