A5703.简单的合并果子 题解
前言(废话)
好好好,又抄 NOIP 题是吧。
这个题我有两种解法
思路
挺像哈夫曼的。
方法 1
使用 STL 堆,每次弹出都会弹出两个最小的数,计算过后放回去即可。时间复杂度 O(nlogn)O(n \log n)O(nlogn)。
方法 2
我们回归问题的本质,我们还是要选取最小的两堆果子,最清真、最自然的方式显然是排序了吧。先排序,选取最小的两堆果子,然后合并,插入。但是插入的效率太低了,我们想要优化。
我们可以把这些需要插入的点用一个队列存储起来,首先这些需要插入的点肯定会越来越大 显然 , 这相当于延迟插入。当我们目标插入点就是我们当前最小的那一堆的时候,我们就把他插入进来。
以上是精神,代码写出来大概就是,桶排,建立两个队列,排序结果放进第一个当中,合并结果放在第二个当中,每次选从两个队列队头选取比较小的合并。
——摘自洛谷《题解 P6038 【合并果子 加强版】》
时间复杂度 O(n)O(n)O(n)。
代码
方法 1
记住要设置,不要用初始的排序方法。
可以通过非常简单的 此题。
方法 2
同样使用 STL 堆。
可以通过数据量巨大的 此题。