超市

  1. 超市

超市里有 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;
}
posted @ 2022-05-18 16:16  TTMoon  阅读(12)  评论(0)    收藏  举报