H : [算法竞赛进阶指南]Supermarket
Time Limit:2 Sec Memory Limit:128 MiB
Back Submit Edit
Description
[poj 1456]
超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品(即当天di<=0)不能再卖。
求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。
Input
输入包含多组测试用例。
每组测试用例,以输入整数N开始,接下里输入N对pi和di,分别代表第i件商品的利润和过期时间。
在输入中,数据之间可以自由穿插任意个空格或空行,输入至文件结尾时终止输入,保证数据正确。
数据规模:
0 ≤ N ≤ 10000
1 ≤ pi,di ≤ 10000
Output
对于每组产品,输出一个该组的最大收益值。
每个结果占一行。
Sample Input
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2
5 20 50 10
Sample Output
80
185
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
int val;
int time;
}edge[10005];
bool fuction(node x1,node x2)
{
return x1.time<x2.time;
}
int main(){
// freopen("qwe.txt","r",stdin);
int n;
while(scanf("%d",&n)==1)
{
priority_queue<int ,vector<int > ,greater<int > >que;//建立小顶堆 存储商品个价值属性
int ans=0;
for(int i=0;i<n;i++)
scanf("%d%d",&edge[i].val,&edge[i].time);//建立商品的属性
sort(edge,edge+n,fuction);//通过二元断言以商品的保质期排序
for(int i=0;i<n;i++)
{
if(que.size()<edge[i].time)
{que.push(edge[i].val);
ans+=edge[i].val;
}//先贪心将没有过保质期的商品都卖出去
else if(que.top()<edge[i].val)//因为是一件一件的商品售出的所以当不符合上述条件时,
//即是 que.size()==edge[i].time的结果 达到了“满负荷”售出商品的状态
//而在 edge[i].time时间下 edge[i]商品也是可以售出的
//而此时出现了更有原则就是有一个较大价值商品取替换价值最低的商品
//又由于这是小顶堆 堆顶即最小值
{
ans-=que.top();
ans+=edge[i].val;
que.pop();
que.push(edge[i].val);
}
}
cout<<ans<<endl;
}
return 0;
}