我最近尝试解决Codeforces上的一个问题我确实得到了正确的解决方案但我现在正试图证明它。算法是这样的:
以最小的折扣并将其应用于最昂贵的折扣,并免费获得两个较便宜的折扣。然后继续做,直到没有物品离开。
我有点坚持证据。如果有人可以通过矛盾给我一个正式的证据,那将是很好的。
答案 0 :(得分:1)
它分为两部分:
选择哪个折扣?
假设我们选择接受任何其他折扣(m
件免费2件)而不是最小件(n
件,n<m
):将文章a(1)
购买到{ {1}}我们免费获得文章a(m)
和b
。我们可以采取最小的折扣,购买文章c
至a(1)
以免费获取a(n)
和b
,并将商品c
购买至{{ 1}}以全价结束同样的情况。因此,选择最小的折扣是最差的,与其他选择相同。
要挑选哪些免费文章?
现在假设我们将折扣应用于商品a(n+1)
和a(m)
而不是最贵的商品a1
和a2
(b1
或{{1} })。我们假设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
不是最理想的。