超市
- 超市
超市里有 NN 件商品,每件商品都有利润 pipi 和过期时间 didi,每天只能卖一件商品,过期商品不能再卖。
求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。
输入格式
输入包含多组测试用例。
每组测试用例,以输入整数 NN 开始,接下来输入 NN 对 pipi 和 didi,分别代表第 ii 件商品的利润和过期时间。
在输入中,数据之间可以自由穿插任意个空格或空行,输入至文件结尾时终止输入,保证数据正确。
输出格式
对于每组产品,输出一个该组的最大收益值。
每个结果占一行。
数据范围
0≤N≤100000≤N≤10000,
1≤pi,di≤100001≤pi,di≤10000
最多有 1414 组测试样例
输入样例:
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
思想:平常不写作业,在ddl前补完(玩的就是心跳)
从后往前数日期,则从当前到最后日期的商品都可以选,每一天都选最大的商品
样例二:
7
20 1
2 1
100 2
8 2
10 3
50 10
5 20
从第20往前数,第20天选5 20 , 第19到11天没有商品选,第10天选50 10,第9天到第4天没有商品选,第3天选商品10 3,第2天选商品100 2,第一天可选的商品为20 1、2 1、8 2,所以第一天选商品20 1
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
const int N = 10010;
int n, x, y;
int main(){
while(cin>>n){
priority_queue<int, vector<int>, less<int> > q;
vector<int> temp[N];
while(n--){
cin >> x >> y;
temp[y].push_back(x);
}
int ans = 0;
for(int i=N-1; i; i--){
if(temp[i].size()){
for(auto x : temp[i])
q.push(x);
}
if(!q.empty()){
ans += q.top();
q.pop();
}
}
cout << ans << endl;
}
return 0;
}