题解:AT_abc310_h [ABC310Ex] Negative Cost
_determination_ · · 题解
题外话:vp 的时候看知乎被抓了,教练惩罚我讲这道题。
一个典(?)的背包优化
好的这个东西一看就很背包,但是容量太大了。对于这种大容量小代价的背包有一个做法(也是今天才学到的,但是教练说之前讲过 n 次了(大雾))。
我们考虑贪心,选性价比最优的方案。但是正常情况下不能直接贪,因为会有一部分容量浪费掉,你选的一些最优性价比物品可能会导致这些部分无法利用。
欸?我枚举浪费掉的部分然后剩下的跑贪心不就行了?
但是我们注意到这样一个问题,就是如果不用性价比最高物品填充的容量太大了怎么办?
证明:设物品的最大代价为
显然由于是完全背包,所以代价一样的物品直接取最优价值就好了。那么如果选择了
那么你做容量在
回到这道题
好的我们得到了一个做法,但是我们发现根本不能直接套上去。
原因在于我们约束的是法力值,但是要最优化的是操作次数。
那我们能不能把法术组合一起,然后就不管法力只管次数了呢?
下文称
我们称一个操作序列是合法的,当且仅当
我们称一个操作序列是优秀的,当且仅当他合法并且
称一个法术组是优秀的,当且仅当他的长度小于等于
证明:每一个合法操作序列都可以拆成若干优秀操作序列。
对于每一个
证明:优秀操作序列可以拆成若干优秀法术组。
根据鸽巢原理,对于长度大于
那么我们拆出来了若干长度在
好的那么我们每一个操作序列都可以用若干优秀法术组表示。这些法术组可以随意调换位置和多次使用。
那我们背包要保留的物品本质上是一堆法术组。这些法术组最多有
完成
这个法术组合直接做一个背包就好了,约束一下背包的魔法和以及次数和不能超过
证明一下在背包过程也只需要把魔法和控制在
那你就得到了
Link.