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