https://ac.nowcoder.com/acm/problem/50995

题意:
超市有n件物品,已知它们的利润p和过期时间d,每天只能卖一件一件物品,过期的物品不能售卖,合理安排每天售卖的物品,问最大利润是多少?
~多组数据输入输出

分析:
最大价值中先要保证物品不过期,先按日期正序排序,排序后把物品的价值放入优先队列(正序队列)中,如果队列物品数量大于当前物品的截止时间,那么把队列排头丢掉,这货利润这么低,用后面的物品可以完全代替了。最后统计求和一下优先队列里面的所有值就行了。

代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,i,j;
struct Hi{
    int p,d;
}a[10005];
int c[10005];
int cmp(Hi A,Hi B){
    return A.d<B.d;
}
int main()
{
    while(~scanf("%d",&n)){
        memset(a,0,sizeof(a));
        memset(c,0,sizeof(c));
        for(i=0;i<n;i++){
            scanf("%d%d",&a[i].p,&a[i].d);
        }
        sort(a,a+n,cmp);
        priority_queue <int,vector<int>,greater<int>> q;
        for(i=0;i<n;i++){
            q.push(a[i].p);
            if(a[i].d<q.size()){
                q.pop();
            }
        }
        int sum=0;
        while(!q.empty()){
            sum+=q.top();
            q.pop();
        }
        printf("%d\n",sum);
    }
}