题目
一家超市出售一套产品 。在截止期限 内,它为每种产品 赚取利润 ,该期限是从开始销售之时起以时间单位的整数表示的。每种产品仅花费一个时间单位就可以出售。
销售进度表 是产品 的有序子集,根据 的顺序,每个产品 的销售在截止期限 之前或 到期时完成。
销售计划的利润为 。最佳销售时间表是利润最高的时间表。
编写一个程序,该程序从输入文本文件中读取产品集,并为每组产品计算最佳销售计划的利润。
解题思路
直接使用贪心算法
将产品按照利润从大到小进行排序,优先售卖利润高的产品。
遍历产品,对于每个产品 ,它可以选择在第 1 到第 个时间单位售卖。
而对于每个产品,越晚卖越好,这样可以卖更多的其他截止日期更小的产品。
所以,优先在第 个时间单位卖产品 ,
如果这个时间单位已卖过其他产品(),就选第 天卖,依此类推。
C++代码
#include<iostream> #include<vector> #include<algorithm> using namespace std; struct Prod{ int p; int d; }; bool cmp(Prod& x, Prod& y){ return x.p > y.p; } int main(){ int n; while(cin >> n){ vector<Prod> a(n); int deadline = 0; for(int i=0; i<n; ++i){ cin >> a[i].p >> a[i].d; deadline = max(deadline, a[i].d); } sort(a.begin(), a.end(), cmp); vector<bool> vis(deadline+1, false); int ans = 0; for(int i=0; i<a.size(); ++i){ int k = a[i].d; while(k>=1 && vis[k]) --k; if(k>=1){ ans += a[i].p; vis[k] = true; } } cout << ans << endl; } }