# 题意
超市里有N件商品,每个商品都有利润pi和过期时间di,每天只能卖一件商品,过期商品(即当天di<=0)不能再卖。
求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。
0 <=N <= 1e4
0 <= d,p <= 1e5
# 题解
按照价值降序,每次扫描到一个价值,尝试一下在过期之前能不能卖出去;
此时可能已经有比它更大价值的产品占用了一些日期,于是从过期时间往前面找,直到找到一个空位置。
如果这个空位置大于0,那么就把这个产品安排在这天卖出。
1 #include <bits/stdc++.h> 2 #define pii pair<int,int> 3 #define fi first 4 #define se second 5 using namespace std; 6 const int N=1e4+10; 7 int fa[N]; 8 9 pii a[N]; 10 int find(int x){ 11 if(fa[x]==x) return x; 12 return fa[x]=find(fa[x]); 13 } 14 int n; 15 int main(){ 16 while(cin>>n){ 17 for(int i=0;i<=N;i++) 18 fa[i]=i; 19 for(int i=0;i<n;i++) 20 cin>>a[i].fi>>a[i].se; 21 sort(a,a+n); 22 reverse(a,a+n); 23 int ans=0; 24 for(int i=0;i<n;i++){ 25 int pos=find(a[i].se); 26 if(pos>0){ 27 fa[pos]=pos-1; 28 ans+=a[i].fi; 29 } 30 } 31 cout<<ans<<endl; 32 } 33 }