超市里有N件商品,每个商品都有利润pipi和过期时间didi,每天只能卖一件商品,过期商品(即当天di<=0di<=0)不能再卖。
求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。
输入格式
输入包含多组测试用例。
每组测试用例,以输入整数N开始,接下里输入N对pipi和didi,分别代表第i件商品的利润和过期时间。
在输入中,数据之间可以自由穿插任意个空格或空行,输入至文件结尾时终止输入,保证数据正确。
输出格式
对于每组产品,输出一个该组的最大收益值。
每个结果占一行。
数据范围
0≤N≤100000≤N≤10000,
1≤pi,di≤100001≤pi,di≤10000
输入样例:
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2
5 20 50 10
输出样例:
80
185
贪心,抽象一下,题目的意思也就是说,前n天最多只能卖n件东西,如果当前物品保质期大于n,那么说明可以立即加入卖的行列中。
小顶堆可以用DP理解为当前天数下的最大收益,n个物品,必然会在n天以内卖完,物品按保质期排序,从第一个开始枚举,如果当前物品保质期天数大于小顶堆物品数量,可以直接加进去卖,其他情况下,只把最大的留在小顶堆
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define N 10010
priority_queue< int,vector<int>,greater<int> >que;
pair<int,int>p[N];
int main()
{
int n;
while(cin>>n){
for (int i = 0; i < n; ++i)
cin>>p[i].second>>p[i].first;
sort(p,p+n);
for(int i=0;i<n;i++){
if(que.size()<p[i].first)
que.push(p[i].second);
else if(que.top()<p[i].second){
que.pop();
que.push(p[i].second);
}
}
int sum=0;
while(!que.empty()){
sum+=que.top();
que.pop();
}
cout<<sum<<endl;
}
return 0;
}