1、题目描述
一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管切成长度多大的两半,都要花费20个铜板。
问:一群人想整分整块金条,怎么分最省铜板?
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60。
金条要分成10,20,30。如果先把长度60的金条分成10和50,花费60;再把长度50的金条分成20和30,花费50;一共花费110铜板。
但是如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20,花费30;一共花费90铜板。
输入一个数组,返回分割的最小代价。
2、思路分析
通过小根堆,首先将所有数据加入到小根堆,
然后只要小根堆数据个数大于1,就弹出两个数并累加,
之后再把累加值放到小根堆里去,所有的累加和即为最小代价
3 代码实现:
c
public static int lessMoney(int[] arr) {
//1、准备一个小根堆
PriorityQueue<Integer> pQ = new PriorityQueue<>();
//2、把所有数字扔到小根堆中
for (int i = 0; i < arr.length; i++) {
pQ.add(arr[i]);
}
int sum = 0;
int cur = 0;
while (pQ.size() > 1) {
//3、每次弹出两个数字进行结合
cur = pQ.poll() + pQ.poll();
sum += cur;
//4、把结合的数扔到小根堆中
pQ.add(cur);
}
return sum;
}