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