https://www.acwing.com/solution/acwing/content/1350/

贪心策略:
在不过期的时间内优先卖出利润更大的产品。

按照价值降序,每次扫描到一个价值,尝试一下在过期之前能不能卖出去;此时可能已经有比它更大价值的产品占用了一些日期,于是从过期时间往前面找,直到找到一个空位置。如果这个空位置大于0,那么就把这个产品安排在这天卖出。

暴力找位置最坏复杂度可以达到O(n2)O(n2),所以用并查集优化,每个节点代表日期,日期记录他最近的前面的空闲日期是哪天,每次用掉这天就把这个点和前面的点连起

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef pair<int,int>pll;
const int N=1e4+10;
pll store[N];
int n;
int f[N];
int get(int x){
    return x==f[x]?x:f[x]=get(f[x]);
}

int main(){
    while(cin>>n){
        for(int i=1;i<=n;i++){
            cin>>store[i].first>>store[i].second;

        }
        sort(store+1,store+n+1);
        reverse(store+1,store+n+1);
        for(int i=1;i<=10010;i++) f[i]=i;
        int res=0;
        for(int i=1;i<=n;i++){
            int day=store[i].second;//如果这天的父节点为0的话,排不了这点
            if(get(day)>0){
                res+=store[i].first;
                f[get(day)]-=1;
            }
        }
        cout<<res<<endl;
    }
    return 0;
}

 posted on 2019-08-24 19:28  谁是凶手1703  阅读(64)  评论(0)    收藏  举报