#CSPJ2019C. 纪念品 (Souvenir)
纪念品 (Souvenir)
题目描述
小伟突然获得一种超能力,他知道未来 天 种纪念品每天的价格。某个纪念品的价格是指购买一个该纪念品所需的金币数量,以及卖出一个该纪念品换回的金币数量。
每天,小伟可以进行以下两种交易无限次:
- 任选一个纪念品,若手上有足够金币,以当日价格购买该纪念品;
- 卖出持有的任意一个纪念品,以当日价格换回金币。
每天卖出纪念品换回的金币可以立即用于购买纪念品,当日购买的纪念品也可以当日卖出换回金币。当然,一直持有纪念品也是可以的。
天之后,小伟的超能力消失。因此他一定会在第 天卖出所有纪念品换回金币。
小伟现在有 枚金币,他想要在超能力消失后拥有尽可能多的金币。
输入格式
第一行包含三个正整数 , , ,相邻两数之间以一个空格分开,分别代表未来天数 ,纪念品数量 ,小伟现在拥有的金币数量 。
接下来 行,每行包含 个正整数,相邻两数之间以一个空格分隔。第 行的 个正整数分别为 , , ...... , , 其中 表示第 天第 种纪念品的价格。
输出格式
输出仅一行,包含一个正整数,表示小伟在超能力消失后最多能拥有的金币数量。
6 1 100
50
20
25
20
25
50
305
最佳策略是:
第二天花光所有 枚金币买入 个纪念品 ; 第三天卖出 个纪念品 ,获得金币 枚; 第四天买入 个纪念品 ,剩余 枚金币; 第六天必须卖出所有纪念品换回 枚金币,第四天剩余 枚金币,共 枚金币。
超能力消失后,小伟最多拥有 枚金币。
3 3 100
10 20 15
15 17 13
15 25 16
217
最佳策略是:
第一天花光所有金币买入 个纪念品 ; 第二天卖出全部纪念品 得到 枚金币并买入 个纪念品 和 个纪念品 ,剩余 枚金币; 第三天必须卖出所有纪念品换回 枚金币,第二天剩余 枚金币,共 枚金币。
超能力消失后,小伟最多拥有 枚金币。
数据范围与提示
对于 的数据,。 对于 的数据,,所有价格 。 另有 的数据,。 另有 的数据,。 对于 的数据,,所有价格 ,数据保证任意时刻,小明手上的金币数不可能超过 。
分析
【分析】
这道题已知N件物品未来T天的价格,需要通过交易来让手中的M枚金币尽可能变多,并且交易不限次数且没有手续费。
首先看数据范围:
对于T=1的10分,因为只有一天,所以每件物品只有一个价格,无论进行多少次买卖,钱都不会变多。因此T=1时直接输出M即可。
对于N=1的15分,只有一件商品,那么只要明天比今天贵,今天应该能买多少就买多少。因为明天可以先直接全部卖掉,这样就实现了赚钱最大化,然后再考虑明天是否重新买回。
由N=1的情况进一步总结得出,对于每一天的每件物品,就是使用当天的价格赚取今明两天的差价。这实际上是一个完全背包问题的模型,每天都是一轮完全背包问题。每一天手中的金币为背包总体积,每件物品的体积就是物品当天的价格,每件物品的价值就是当天与次日的价格差,这样做一次完全背包就能计算出来每天最多能赚多少钱。程序的时间复杂度是O(NMT)。