从国王游戏看邻项交换

upd on 2024.2.23:才发现我是 sb,证了些什么玩意。(交换处证反)

对于这道题,我们只来证明贪心的正确性,并不探究推导过程(这么玄学的贪心真有人能推导出来吗)。

我们需要证明按照 li×ri 是最优的。

现在,我们钦定序列按照 li×ri 排序,证明无论如何,从序列中交换若干对数都是不优的。

首先,交换若干对数的本质就是不断选择一对数对其交换,所以我们需要证明从序列中交换任意 (ai,aj) 都是不优的,此处我们钦定 i<j

可以发现,交换 (ai,aj) 可以表示为:

交换 (ai,ai+1),交换 (ai+1,ai+2)(注意此时 ai+1 就是最初的 ai),……,交换 (aj1,aj)(此时 aj1 是原来的 ai)。

经过这样的操作,我们把 ai 交换到了 aj 的位置;同理,也可以把 aj 交换到原来 ai 的位置。

所以交换一对数的本质就是不断交换相邻的一对数。所以我们只需证明从序列中交换一对相邻的数是不优的。

这就是贪心的重要证明方法——邻项交换。

我们如果要证明一个贪心得到的序列是最优的,只需证明交换相邻一对数不会更优。

如果交换两个相邻元素对其他元素没有影响,只对这两个元素得到的答案有影响,那么就可以按照某种方法排序来贪心。

可以发现,邻项交换的重要特征就是答案不具有牵连泛性当然,这是我自己取的名词

牵连泛性,即对一些元素按照某种方式修改不会对其它元素的贡献产生牵连。

看回这道题,交换相邻两个数对于前面数和后面数的贡献显然不会变。

那我们现在考虑交换 (ai,aj),j=i+1 会不会使两者对答案的贡献较大值更优,因为答案取的就是最大值。

x=k=0i1lk,一开始两者的贡献较大值为 ans1=max(wi,wj)=max(xri,x×lirj)

交换后,贡献较大值为 ans2=max(xrj,x×ljri)

需要证明 ans1ans2,即四者中的最大值等于 ans2

显然,四者中最大值只能从 x×lirjx×ljri 取,另两个必定不是最大值。

li×rilj×rjlirjljrix×lirjx×ljri

于是四者中的最大值为 ans2,交换后不会更优。

证毕。

开头说不会探究推导,但感觉可以推导。

从思考的角度来看,要对原始序列交换,看什么情况下更优,钦定不交换更优,可以倒推出同样的结论。

另外,此题需要高精度。

最后,附上 yk 课件中贪心的描述。

贪心算法难点在于很难一次想到一个正确的算法
直觉上的贪心很多时候是错的,但是你又很难去真正证明它的正确性
通常我们只能通过举反例证明其不对
或者通过构造各种数据对拍,如果拍不出错误就暂且当做它是正确的
在平时训练的时候,最好还是能够掌握贪心算法的大概证明
当然如果没有其他思路了,就大胆猜想,不用证明了

关于贪心证明方法。

临项交换:
如果交换两个相邻元素对其他元素没有影响,只对这两个元素得到的答案有影响,那么就可以按照某种方法排序来贪心。
范围缩放:
任何局部最优策略作用范围的扩展不会造成整体结果变差
反证法
数学归纳法

例题:CF746F

先写到这,等想起什么再更。

posted @   BYR_KKK  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示