从国王游戏看邻项交换
upd on 2024.2.23:才发现我是 sb,证了些什么玩意。(交换处证反)
对于这道题,我们只来证明贪心的正确性,并不探究推导过程(这么玄学的贪心真有人能推导出来吗)。
我们需要证明按照 \(l_i\times r_i\) 是最优的。
现在,我们钦定序列按照 \(l_i\times r_i\) 排序,证明无论如何,从序列中交换若干对数都是不优的。
首先,交换若干对数的本质就是不断选择一对数对其交换,所以我们需要证明从序列中交换任意 \((a_i,a_j)\) 都是不优的,此处我们钦定 \(i<j\)。
可以发现,交换 \((a_i,a_j)\) 可以表示为:
交换 \((a_i,a_{i+1})\),交换 \((a_{i+1},a_{i+2})\)(注意此时 \(a_{i+1}\) 就是最初的 \(a_i\)),……,交换 \((a_{j-1},a_j)\)(此时 \(a_{j-1}\) 是原来的 \(a_i\))。
经过这样的操作,我们把 \(a_i\) 交换到了 \(a_j\) 的位置;同理,也可以把 \(a_j\) 交换到原来 \(a_i\) 的位置。
所以交换一对数的本质就是不断交换相邻的一对数。所以我们只需证明从序列中交换一对相邻的数是不优的。
这就是贪心的重要证明方法——邻项交换。
我们如果要证明一个贪心得到的序列是最优的,只需证明交换相邻一对数不会更优。
如果交换两个相邻元素对其他元素没有影响,只对这两个元素得到的答案有影响,那么就可以按照某种方法排序来贪心。
可以发现,邻项交换的重要特征就是答案不具有牵连泛性,当然,这是我自己取的名词。
牵连泛性,即对一些元素按照某种方式修改不会对其它元素的贡献产生牵连。
看回这道题,交换相邻两个数对于前面数和后面数的贡献显然不会变。
那我们现在考虑交换 \((a_i,a_j),j=i+1\) 会不会使两者对答案的贡献较大值更优,因为答案取的就是最大值。
设 \(x=\prod\limits_{k=0}^{i-1}l_k\),一开始两者的贡献较大值为 \(ans_1=\max(w_i,w_j)=\max(\frac{x}{r_i},\frac{x\times l_i}{r_j})\)。
交换后,贡献较大值为 \(ans_2=\max(\frac{x}{r_j},\frac{x\times l_j}{r_i})\)。
需要证明 \(ans_1\le ans_2\),即四者中的最大值等于 \(ans_2\)。
显然,四者中最大值只能从 \(\frac{x\times l_i}{r_j}\) 和 \(\frac{x\times l_j}{r_i}\) 取,另两个必定不是最大值。
\(l_i\times r_i\le l_j\times r_j\rightarrow \frac{l_i}{r_j}\le \frac{l_j}{r_i}\rightarrow \frac{x\times l_i}{r_j}\le \frac{x\times l_j}{r_i}\)
于是四者中的最大值为 \(ans_2\),交换后不会更优。
证毕。
开头说不会探究推导,但感觉可以推导。
从思考的角度来看,要对原始序列交换,看什么情况下更优,钦定不交换更优,可以倒推出同样的结论。
另外,此题需要高精度。
最后,附上 yk 课件中贪心的描述。
贪心算法难点在于很难一次想到一个正确的算法
直觉上的贪心很多时候是错的,但是你又很难去真正证明它的正确性
通常我们只能通过举反例证明其不对
或者通过构造各种数据对拍,如果拍不出错误就暂且当做它是正确的
在平时训练的时候,最好还是能够掌握贪心算法的大概证明
当然如果没有其他思路了,就大胆猜想,不用证明了
关于贪心证明方法。
临项交换:
如果交换两个相邻元素对其他元素没有影响,只对这两个元素得到的答案有影响,那么就可以按照某种方法排序来贪心。
范围缩放:
任何局部最优策略作用范围的扩展不会造成整体结果变差
反证法
数学归纳法
例题:CF746F
先写到这,等想起什么再更。