一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,
不管切成长度多大的两半,都要花费20个铜板。
一群人想整分整块金条,怎么分最省铜板?
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60.
金条要分成10,20,30三个部分。如果先把长度60的金条分成10和50,花费60.
再把长度50的金条分成20和30,花费50,一共花费100铜板;
如果60先分成30和30,在把30分成20和10,一共花费 90铜板;
输入一个数组,返回分割的最小代价。
// 哈夫曼编码问题
public static int lessMoney2(int[] arr) {
PriorityQueue<Integer> pQ = new PriorityQueue<>();
// 所有数都入小根堆
for (int i = 0; i < arr.length; i++) {
pQ.add(arr[i]);
}
int sum = 0;
int cur = 0;
while (pQ.size() > 1) {
// 弹出两个数相加
cur = pQ.poll() + pQ.poll();
// 累加
sum += cur;
// 加完再进入
pQ.add(cur);
}
return sum;
}