考虑以过期时间升序排序。
维护一个价值的小根堆。
每次都将商品丢入到堆里面,判断当前堆中的个数是不是大于过期时间,是的话,弹出堆顶(价值最小的)。
这样最后堆中剩余的就是规定天数内能获得的最大收益
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
ll t,w;
}a[100005];
bool cmp(node a,node b){
return a.t<b.t;
}
int main()
{
int n;
while(cin>>n){
for(int i=1;i<=n;i++)
scanf("%lld%lld",&a[i].w,&a[i].t);
sort(a+1,a+1+n,cmp);
priority_queue< ll,vector<ll>,greater<ll> >q;
for(int i=1;i<=n;i++)
{
q.push(a[i].w);
if(a[i].t<q.size())
q.pop();
}
ll ans=0;
while(q.size())
{
ans+=q.top();
q.pop();
}
cout<<ans<<endl;
}
}
京公网安备 11010502036488号