题目:
一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为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铜板。
输入一个数组,返回分割的最小代价。
实现思路
这其实就是个贪心求解可利用哈夫曼编码构造解
采用优先队列的小根堆结构构造哈夫曼树
每次取出堆中最小的两个元素并相加生成新的结果 放回到堆中,直到堆中元素只有一个 就是最小代价
代码
/**
* @description: 贪心求解(哈夫曼编码)
* @Author MRyan
* @Date 2020/6/12 16:11
* @Version 1.0
*/
/**
* 实现思路:采用优先队列的小根堆结构构造哈夫曼树
* 每次取出堆中最小的两个元素并相加生成新的结果 放回到堆中,直到堆中元素只有一个 就是最小代价
*/
public class code_10 {
public static final void main(String[] args) {
int[] nums = {2,5,3,6,9};
int answer = answer(nums);
System.out.println(answer);
}
private static int answer(int[] nums) {
int answer = 0;
PriorityQueue<Integer> integers = new PriorityQueue<>();
for (int i : nums) {
integers.add(i);
}
while (integers.size() > 1) {
Integer one = integers.poll();
Integer two = integers.poll();
integers.add(one + two);
answer += one + two;
}
return answer;
}
}