我最近尝试在 Codeforces 上解决一个问题,我确实得到了正确的解决方案,但现在正试图证明它。算法是这样的:
拿最小的折扣,把它应用到最贵的,连续两个便宜的免费。然后不断地做,直到没有物品剩下。
我有点卡在证明上。如果有人可以通过矛盾给我一个正式的证明,那就太好了。
问题!
它分为两部分:
选择哪个折扣?
假设我们选择m
除最小的折扣(n
物品, )之外的任何其他折扣(物品免费 2 n<m
):购买物品a(1)
我们免费a(m)
获得b
物品c
。我们可以采取最小的折扣,购买物品a(1)
以免费a(n)
获得,b
并以全价购买物品最终处于相同的情况。因此,选择最小的折扣在最坏的情况下与其他选择相提并论。c
a(n+1)
a(m)
选择哪些免费文章?
现在假设我们将折扣应用于商品a1
,a2
而不是最昂贵的b1
商品b2
(cost(a1)<cost(b1)
或cost(a2)<cost(b2)
)。让我们假设,cost(a1)<cost(a2)
因为案例是对称的。出现三种情况:
a2
不知何故,作为促销活动的一部分,我们仍然设法免费获得:a1
如果我们还没有选择它,我们也可以得到。c
. 出现以下情况之一:
c<=cost(a1)
: 我们可以交换a1
和a2
,这会降低这个篮子的成本,而不需要改变其他任何东西。cost(a2)<=c<cost(a1)
: 让我们打电话d
,e
我们从第二次折扣中得到的物品,d
是最贵的。我们可以a2
在第一次折扣中选择免费商品,在第二次折扣中将其替换为免费商品,然后在第二次折扣中d
选择a1
免费商品,从而降低或相等的成本。a2
和支付,因此挑选不是最理想的。a1
a1