题解

1 条题解

  • 0
    @ 2023-05-25 21:37:12

    考虑贪心,最朴素的想法就是从大到小枚举物品,并且免费获得第一个价格严格小于它的物品。但很显然这样的想法是错误的,原因在于拿走最大的可以免费的物品,可能会导致后面浪费了一次免费的机会,此时有可能买下这个物品更优,可以考虑反悔贪心。

    可以用一个小根堆维护当前所免费的物品,考虑当前有两个价值为 x 的物品,可以做以下两种选择:

    1.两个物品都直接购买,代价为 2x。

    2.对于之前的物品,有一个策略是买了 a 免费 b(此时满足 a>b>x),此时将这个决策反悔,即买 a 和 b,免费 2x。此时的就相当于多买了一个 b。代价为 b。

    若 2x≤b,那么直接购买 2x 更优;

    若 2x>b,那么就可以考虑将之前的决策反悔。

    对于反悔操作,可以发现实际上减少的代价为 2x?b。那么就可以直接把这个 2x?b 看成一个免费的物品丢到小根堆中。表示此时又可以反悔操作 2。而 2x?b 反悔后,自然又可以反悔一次买 a 免费 b 的操作。而由于 x<b,自然有 2x?b<b,那么在小根堆里自然先会反悔 2x?b 再反悔 b。直接把 b 也丢入小根堆中即可。

    如果当前枚举到的 x 的价值大于堆顶元素,那么显然反悔堆顶的决策,转而免费这两个(如果只剩下一个 x 就只免费这一个)物品会更优,直接将两个 x 丢入堆中即可。

  • 1

信息

ID
2697
难度
9
分类
贪心 | 数据结构 | 点击显示
标签
(无)
递交数
1
已通过
1
通过率
100%
被复制
1
上传者