Rainbow的商店
-
总时间限制:
- 1000ms 内存限制:
- 262144kB
-
描述
-
Rainbow开了一家商店,在一次进货中获得了N个商品。
已知每个商品的利润和过期时间。
Rainbow每天只能卖一个商品,并且过期商品不能再卖。
Rainbow也可以选择在每天出售哪个商品,并且一定可以卖出。
由于这些限制,Rainbow需要制定一份合理的售卖计划。请你计算一下,Rainbow最终可以获得的最大收益。
输入
-
第一行两个整数N。
接下来N行每行两个整数,分别表示每个商品的利润、过期时间。
1<=N,利润,时间<=10000。
输出
- 输出一个整数,表示Rainbow最终可以获得的最大收益。 样例输入
-
7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
样例输出
-
185
提示
-
第1天卖出20
第2天卖出100
第3天卖出10
第4天卖出50(实际上只要在第10天卖就可以)
第5天卖出5(实际上只要在第20天前卖就可以)
总计185
其它2件商品由于过期、每天只能卖一个的限制,在最优策略下应该不出售。 -
- 从后往前扫
-
-
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; struct obj { int day; int val; }Obj[10005]; bool Vis[10005]={0}; bool cmp(const obj&a,const obj&b) { return a.day<b.day||a.day==b.day&&a.val<b.val; } int main() { int n; cin>>n; for(int i=0;i<n;++i) { cin>>Obj[i].val>>Obj[i].day; } sort(Obj,Obj+n,cmp); int sum=0; for(int day=n;day>=1;--day) { int tmp=0,id=0; for(int i=n-1;i>=0;--i) { if(Obj[i].day>=day) { if(!Vis[i]&&Obj[i].val>tmp) { tmp=Obj[i].val; id=i; } } else break; } if(tmp>0) { sum+=tmp; Vis[id]=true; } } cout<<sum<<endl; return 0; }