贪心
0x00 引言
贪心的本质很好理解。它模拟的是一个贪婪人的抉择。贪心维护的是当前状态的最优解,不保证当前的最优解是全局最优解。
对于比较简单的贪心,我们总是凭借感觉做出,就轻视了贪心。实际上,贪心是一种思想,其中不同的思维方式和贪心方法不计其数。我们要抱着敬畏的态度去学习和探索。这篇文章收录了较难的贪心问题的题目,主要介绍贪心的进阶思想,希望可以通过这些题目进一步摸清贪心思想的本质。
0x10 种类一:临项交换法
个人理解。临项交换法是一个对贪心算法如何排序的分析。我们只考虑 \(i\) 和 \(i+1\) 项,就像我们在结构体排序中写的 cmp
一样。其中两项的分析是排序的底层逻辑,只有把其中两项分析明白了,我们才知道是怎么排序,拿什么排序。
例题1:NOIP2012 国王游戏
形式化的题面: 给定 \(a_i\) 和 \(b_i\),允许重排列,使得 $ \frac{\prod_{k=0}^{i-1} a_k}{b_i} (1 \leqslant i \leqslant n)$ 的最大值最小,求最大的值。
接下来,我们使用临项交换法来推导这道题目的式子。
首先,可以随意抽取 \((i, i+1)\) 两项进行交换的判断。
设 \(s\) 表示第 \(i\) 个大臣之前的所有大臣的左手上的数字的乘积。那么第 \(i\) 个大臣获得的收益就是 \(\frac{s}{b_i}\) ,第 \(i+1\) 个大臣的收益就是 \(\frac{s \cdot a_{i+1}}{b_{i+1}}\) 。
首先我们明确,可以交换的原因是:\(i\) 和 \(i+1\) 的交换并不会影响之前的大臣的收益,也不会影响之后的大臣的额收益。
如果我们交换 \(i\) 和 \(i+1\),那么他们的收益变成了 $\frac{s}{b_{i+1}} $ 和 \(\frac{s \cdot a_{i+1}}{b_i}\)。