题解 CF1428E Carrots for Rabbits

想象下面的情景:现在你面前有 \(n\) 台可以升级的机器,每台机器都是第 \(1\) 级别。第 \(i\) 台机器从第 \(j\) 级升级到第 \(j+1\) 级的代价为 \(c(i,j)\)(代价当然大于 \(0\)),是一个可以在 \(O(1)\) 时间内计算的常数。你需要升级 \(k\) 次,请问你所需的最小代价。

贪心地想,每次找到一个所需代价最小的机器升级即可。此处只需要用一个优先队列维护即可。但是需要注意,如果是最大代价,贪心就是显然不对的了。

再回到这道题上,\(n\) 个胡萝卜就是 \(n\) 个机器,对每个萝卜的升级就是把它从切 \(x\) 块变成切 \(x+1\) 块。我们设计一个函数 \(f(x,y)\) 表示把长度 \(x\) 的萝卜切成 \(y\) 份的代价,那么升级的代价就是 \(f(x,y)-f(x,y+1)\)。于是就与开头的机器升级问题一样了。

至于 \(f\) 函数很显然是可以 \(O(1)\) 算出来的,只要尽量平均地切即可。

代码实现不难。

posted @ 2021-06-12 15:01  Little09  阅读(43)  评论(0)    收藏  举报