supermarket(冰茶几

# 题意

超市里有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 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12442937.html