[0x17基本数据结构-二叉堆]-Supermarket

题意:
超市里有N件商品,每件商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品不能再卖。求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。
输入格式:
输入包含多组测试用例。
每组测试用例,以输入整数N开始,接下来输入N对pi和di,分别代表第i件商品的利润和过期时间。在输入中,数据之间可以自由穿插任意个空格或空行,输入至文件结尾时终止输入,保证数据正确。
输出格式:
对于每组产品,输出一个该组的最大收益值。每个结果占一行。
题解:一道很容易想的贪心题目,我们可以这样想,因为每件物品都有一个价格和截止时间,这样的话,为了保证售出的总价格最大,那么我们在第i天肯定是要去卖价格高的那件商品了,所以我们首先按照商品价格来排序,这是第一个贪心策略。
第二个贪心策略:对于购买第i件物品,我们必然是越晚买越好,(防止其他日期早的商品购买不了),所以对于第i件物品我们在a[i].d天购买它,如果购买不了,那么我们就在a[i].d-1天购买,依次类推。
那么问题来了,我们怎么知道第i天是否卖了东西呢?
很简单因为日期的大小小于1e4,那么我们可以开一个visited数组来记录第i天是否卖出去了,如果没有卖出去,那就把之一天标记上并且加上当天的价格。
代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 1e4+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
int visited[maxn];
struct wazxy{
    int p,d;
}a[maxn];
struct rule{
    bool operator ()(const wazxy &a,const wazxy & b){
    if(a.p!=b.p) return a.p>b.p;
    }
};

int main(){
    int n;
    while(cin>>n){
        memset(visited,false,sizeof(visited));
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i].p,&a[i].d);
        }
        sort(a+1,a+n+1,rule());
        int ans=0;
        for(int i=1;i<=n;i++){
            for(int j=a[i].d;j>=1;j--){
                if(visited[j]==false){
                    ans+=a[i].p;
                    visited[j]=true;
                    break;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/xxxxxiao123/article/details/106717844
今日推荐