【代码超详解】POJ 1456 Supermarket(贪心 + 并查集)

本文详细解析了POJ 1456 Supermarket问题,介绍了如何通过贪心策略和并查集来实现最大利润的计算。首先,商品按价格降序排列,每天仅售一种未过期商品。关键在于推迟销售利润较高的商品,避免因提前销售导致高利润商品过期无法售卖,从而影响总利润。在实现过程中,通过并查集巧妙地处理了商品售卖计划的冲突问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

在这里插入图片描述

二、算法分析说明与代码编写指导

将商品按价格高到低排序。一天只能卖一种未过期的商品,为了使得总利润最大,我们尽量卖出利润更高的商品。此外,能够晚卖的就晚卖,因为如果很早就卖出去的话,可能会导致在卖出去当日过期的高利润商品因过期无法售卖,而在先卖出去的商品过期的那一天又只剩下利润低的商品可卖,导致总利润降低。
其实看这题的时候,可能你很快能想到贪心,但是你未必能想到用并查集处理,不过在写代码的过程中恰好无意中用上了并查集的思想。
设 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值