贪心
贪心
1.哈夫曼模型
哈夫曼树可以让\(\sum dep*siz\)最小
方法是每次合并最小的两个
小根堆nlogn实现
开两个队列可以O(n)实现 但需要排序所以最后复杂度也为\(O(nlogn)\)
例题
题意即为求\(\sum dep*siz\)的最小值
2.邻项交换法(调整法)
考虑相邻两项交换前与交换后对(局部)答案的影响,以此推出排序标准
需要保证邻项交换只对该两项产生影响才可
例题
首先相邻两个大臣交换对其他所有大臣并无影响,接下来我们不妨设两个大臣分别为\(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.削峰,平均思想
例题
考虑如果出现左边的数大于右边的数,那么删掉左边之后右边的数就会顶上来,从而使得结果变小,这其实就是进行了一个削峰的操作。
每次分组从当前最小的一个开始往右找,不妨设这个最小的为p,假如我们找到x、x+1,假如x的数量大于x+1的数量,此时我们应该把x作为这一组的结尾。
正确性:我们考虑如果不这样做的话那么x以后一定会成为某一组的结尾,但如果这样做那么有可能以后可以让x+1作为结尾,这其实也是进行了一个削峰的操作。
稍微写一下实现
1.最简便的是使用map,分组过程中不断遍历map就好
2.当然可以手写离散化,在非连续的数之间插入一个出现次数为零的数即可,之后过程中使用链表可以保证复杂度为\(O(n)\),所以瓶颈在排序