一、题目描述
二、算法分析说明与代码编写指导
将商品按价格高到低排序。一天只能卖一种未过期的商品,为了使得总利润最大,我们尽量卖出利润更高的商品。此外,能够晚卖的就晚卖,因为如果很早就卖出去的话,可能会导致在卖出去当日过期的高利润商品因过期无法售卖,而在先卖出去的商品过期的那一天又只剩下利润低的商品可卖,导致总利润降低。
其实看这题的时候,可能你很快能想到贪心,但是你未必能想到用并查集处理,不过在写代码的过程中恰好无意中用上了并查集的思想。
设 r(x) 中,x 代表第 x 天过期的商品,而 r(x) 一开始等于 x,只要第 x 天计划卖出任意一样商品,r(x) 就要减去 1,这就使得后续利润没那么高但又同时在第 x 日过期的商品的售卖计划被迫排在更早(当然不要早太多),而不至于和利润更高的商品的售卖计划冲突。
三、AC 代码
#include<cstdio>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
template<size_t n> class union_find {
private:
unsigned root[n], rank[n];
public:
union_find<n>() {
init(); }
union_find<n>(const bool& WannaInit) {
if (WannaInit == true)init(); }
void init() {
fill(rank, rank + n, 1);
for (unsigned i = 0