ABC 415 G(大范围贪心,小范围dp)
G
先分析下操作的本质:花费 \(A_{i}\) 个空瓶,得到 \(B_{i}\) 瓶可乐。
实际上,得到 \(B_{i}\) 瓶可乐后,可以直接喝掉它们并再得到 \(B_{i}\) 个空瓶。因此,操作本质相当于:在剩余空瓶数 \(\geq A_{i}\) 的前提下,可以花费 \(A_{i} - B_{i}\) 个空瓶,并得到 \(B_{i}\) 瓶可乐。
将空瓶看作背包体积,可乐看作价值,则这显然是一个完全背包问题。但是由于 \(n \leq 1e15\),背包体积是非常大的,不可以直接跑背包。
这时我们便有一个启发式的思考:在剩余空瓶数足够多时,是否先一直使用"性价比"最高的方案一定更好呢?
(这里性价比的计算公式:)
\[性价比 = \frac{单次兑换可乐数}{单次净消耗空瓶数} = \frac{B_{i}}{A_{i} - B_{i}}
\]
答案是肯定的,这可以基于常识理解,在此不作证明。
然而,"性价比" 最高的方案 并不代表 一直使用它就是最优解。核心原因在于:"性价比"最高的方案不一定能一直使用。因为"性价比"最高的方案对应的 \(A_{i}\) 也可能会很大,这将会导致使用 "性价比"最高方案 的次数不多(当剩余空瓶数 \(< A_{i}\) 时将不再可以使用);而对于其他方案,虽然它们执行一次的收益并不是最大的,但由于 \(A_{i}\) 较小,执行次数可能会更多,总收益便可能会更大。
由于 \(A_{i} \leq 300\),故可以这样考虑:先贪心地使用"性价比"最高的方案,直至剩余空瓶数刚好 \(\geq\) 设定阈值 \(threshold\)(\(\leq 5e5\)),再对剩下的空瓶做完全背包。
具体细节见代码。