思想
首先给所有的水果按照价值升序排列.然后我们构造一个小根堆.
如果说当前待比较的元素比堆头元素大,那么我们就把堆顶元素弹出,然后把这个待比较元素加入到堆里.这里这个待比较元素有可能会作为新的堆顶.
这样做的目的是因为题目要求最多价值的水果.又由于是小根堆,因此堆顶元素是最小的.因此我们应该尽可能的让堆顶元素最小值最大.
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;
}