Codeforces 913C - Party Lemonade

Author Avatar
Jimmy Zhang Jan 09, 2018
  • Read this article on other devices

因为手残和脑残 ranking 暴降 75,呜呜呜呜呜呜呜~

题面

现有 n (1n30)n \ (1 \le n \le 30) 种瓶装柠檬汽水,每种汽水都有无限瓶。第 ii 种瓶装柠檬汽水有 2i12^{i - 1} 升并且售价 ci (1ci109)c_i \ (1 \le c_i \le 10^9)。现在你需要至少 L (1L109)L \ (1 \le L \le 10^9) 升汽水,请问至少要花多少钱?

题目链接

贪心!

大致思路

注意到第 ii 种瓶装柠檬汽水有 2i12^{i - 1} 升这一特殊的条件。这意味着,第 ii 种柠檬汽水事实上可以由 22 瓶第 i1i - 1 种柠檬汽水替换,或者由 222^2 瓶 第 i2i - 2 种柠檬汽水替换,…… 也就是说,我们可以通过贪心来更新第每种汽水的最优单价——将第 ii 种柠檬汽水的单价更新为第 1i1 \sim i 种柠檬汽水中最省钱的购买方案(对于第 k (1ki)k \ (1 \le k \le i) 种购买 2ik2^{i - k} 瓶)。

但是光这样还是不够的,因为可能出现购买多于 LL 升反而比购买 LL 升便宜的情况。

我们不妨把 LL 先转换成一个二进制数。如果要购买严格等于 LL 升柠檬汽水的话,只需要将二进制 LL11 的位数对应的柠檬汽水都买一瓶就好了(即二进制 LL 的从右往左第 ii 位为 11,那么就购买 11 瓶第 i+1i + 1 种汽水)。 这样我们得到的严格等于 LL 升柠檬汽水的购买方案一定是最优的,因为经过之前的贪心购买与每一种柠檬汽水等量的柠檬汽水所需花费的金额是最优的。

而购买大于 LL 升汽水更优的情况,也就是在上述过程中,购买第 1k1 \sim k 位对应柠檬汽水所花的钱(11 则买,00 则不买)比只购买一瓶第 k+1k + 1 位对应的柠檬汽水所花的钱还要多。在这种情况下我们只需要买一瓶第 k+1k + 1 位对应的柠檬汽水就行了(并且得到了更多的柠檬汽水),而之前位对应的柠檬汽水都无需购买。

具体实现

Submission #34039523

GitHub - Backup Link

This blog is under a CC BY-NC-SA 4.0 Unported License.
Link to this article: https://blog.codgician.pw/2018/01/09/codeforces-913c/