/*
* 在一个操场的四周摆放着n堆石子。现在要将石子有次序地合并成一堆。
* 规定每次至少选两堆,最多选k堆石子合并成新的一堆,合并的费用为新的一堆石子数。
* 对于给定的n堆石子,计算合并成一堆的最大费用和最小费用。
*
* 假设有a,b,c,d,e五堆石子已经按升序排好,
*(为方便描述,这里设任意小的任意堆合并不会比后面的大,任意大的合并不会比前面小)。
* 最多一次可以合并三堆,最少一次两堆。
* 一次三堆:1、 a b c d e cost=0
* 2、 a+b+c d e cost=a+b+c
* 3、 a+b+c+d+e cost=(a+b+c)+(a+b+c+d+e)
* 一次两堆:1、 a b c d e cost=0
* 2、 a+b c d e cost=a+b
* 3、 a+b+c d e cost=(a+b)+(a+b+c)
* 4、 a+b+c+d e cost=(a+b)+(a+b+c)+(a+b+c+d)
* 5、 a+b+c+d+e cost=(a+b)+(a+b+c)+(a+b+c+d)+(a+b+c+d+e)
* 可以看出,再求最小费用的时候,如果一次选择合并三堆的费用要少于一次合并两堆。
* 推广:一次最多可以合并k堆,则每次选择较小的k堆进行合并,产生的费用最小。(最终可能会剩下2<=x<k堆,则按照k-1堆合并)。
* 每次选择较大的2堆合并,产生的费用最大。
*/
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int>a={
45,13,12,
多元Huffman编码问题
![](https://img-home.csdnimg.cn/images/20240711042549.png)