考虑以过期时间升序排序。
维护一个价值的小根堆。
每次都将商品丢入到堆里面,判断当前堆中的个数是不是大于过期时间,是的话,弹出堆顶(价值最小的)。
这样最后堆中剩余的就是规定天数内能获得的最大收益

#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;
   }

}