Acwing145.超市

超市里有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;
}
发布了38 篇原创文章 · 获赞 5 · 访问量 851

猜你喜欢

转载自blog.csdn.net/Fooooooo/article/details/104084721