贪心

贪心

1.哈夫曼模型

哈夫曼树可以让\(\sum dep*siz\)最小

方法是每次合并最小的两个

小根堆nlogn实现

开两个队列可以O(n)实现 但需要排序所以最后复杂度也为\(O(nlogn)\)

例题

P1090 [NOIP 2004 提高组] 合并果子

题意即为求\(\sum dep*siz\)的最小值

2.邻项交换法(调整法)

考虑相邻两项交换前与交换后对(局部)答案的影响,以此推出排序标准

需要保证邻项交换只对该两项产生影响才可

例题

P1080 [NOIP 2012 提高组] 国王游戏

首先相邻两个大臣交换对其他所有大臣并无影响,接下来我们不妨设两个大臣分别为\(a1,b1,a2,b2\),设之前的大臣\(\prod a\)\(x\)

首先如果按照目前的顺序那么两个大臣的答案分别为\(\frac{x}{b1}\)\(\frac{x*a1}{b2}\)

如果交换两者,那么答案变为\(\frac{x}{b2}\)\(\frac{x*a2}{b1}\)

所以假如我们现在的排序是正确的,那么有\(max(\frac{x}{b1},\frac{x*a1}{b2})<max(\frac{x}{b2},\frac{x*a2}{b1})\)

因为\(\frac{x*a2}{b1}>\frac{x}{b1}\)\(\frac{x*a1}{b2}>\frac{x}{b2}\)是显然的

所以我们想保证上面不等式恒成立,只需要保证\(\frac{x*a1}{b2}<\frac{x*a2}{b1}\)

化简一下就是\(a1b1<a2b2\),这也就是我们排序的标准了。

3.削峰,平均思想

例题

P1106 删数问题

考虑如果出现左边的数大于右边的数,那么删掉左边之后右边的数就会顶上来,从而使得结果变小,这其实就是进行了一个削峰的操作。

P4447 [AHOI2018初中组] 分组

每次分组从当前最小的一个开始往右找,不妨设这个最小的为p,假如我们找到x、x+1,假如x的数量大于x+1的数量,此时我们应该把x作为这一组的结尾。

正确性:我们考虑如果不这样做的话那么x以后一定会成为某一组的结尾,但如果这样做那么有可能以后可以让x+1作为结尾,这其实也是进行了一个削峰的操作。

稍微写一下实现

1.最简便的是使用map,分组过程中不断遍历map就好

2.当然可以手写离散化,在非连续的数之间插入一个出现次数为零的数即可,之后过程中使用链表可以保证复杂度为\(O(n)\),所以瓶颈在排序

待归类

P1803 凌乱的yyy / 线段覆盖

posted @ 2025-07-17 14:32  Liooooo  阅读(15)  评论(0)    收藏  举报