2024年码蹄杯高职组国赛第四题 小码哥的滞销 题型:反悔贪心,思维 难度: 钻石

71 阅读1分钟

码题集OJ-小码哥的滞销 (matiji.net)

思想

首先给所有的水果按照价值升序排列.然后我们构造一个小根堆.

如果说当前待比较的元素比堆头元素大,那么我们就把堆顶元素弹出,然后把这个待比较元素加入到堆里.这里这个待比较元素有可能会作为新的堆顶.

这样做的目的是因为题目要求最多价值的水果.又由于是小根堆,因此堆顶元素是最小的.因此我们应该尽可能的让堆顶元素最小值最大.

2.处理水果过期问题

如果说待比较元素比堆里的元素个数要大,那么就可以加入到堆里,因为在堆里水果全部卖完之前它都不会过期.

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
 
struct NODE
{
	int w,t;
	bool operator>(const NODE &b)const
	{
		return w>b.w; //按照价值排序 
	}
}a[N];
int n,ans;
priority_queue<NODE,vector<NODE>,greater<NODE>> q;

bool cmp(NODE a,NODE b) {return a.t<b.t;} //按照过期时间排序 
signed main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i].w>>a[i].t;
	
	sort(a+1,a+n+1,cmp);
	
	for(int i=1;i<=n;i++)
		if(a[i].t>q.size()) //如果待插入元素的过期时间 比 堆顶元素 要大,那就不会过期,插入到堆里 
		q.push(a[i]); 
		
		else if(q.top().w<a[i].w) //如果堆顶元素价值 小于 待插入元素的价值 
	     q.pop(),q.push(a[i]);  //就进行替换
	
	    while(!q.empty()) 
	    {
	    ans+=q.top().w;
	    q.pop();	    	
		}

	 cout<<ans<<endl;
	return 0;
}

image.png