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
浙公网安备 33010602011771号