一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为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铜板;
    输入一个数组,返回分割的最小代价。

    1. // 哈夫曼编码问题
    2. public static int lessMoney2(int[] arr) {
    3. PriorityQueue<Integer> pQ = new PriorityQueue<>();
    4. // 所有数都入小根堆
    5. for (int i = 0; i < arr.length; i++) {
    6. pQ.add(arr[i]);
    7. }
    8. int sum = 0;
    9. int cur = 0;
    10. while (pQ.size() > 1) {
    11. // 弹出两个数相加
    12. cur = pQ.poll() + pQ.poll();
    13. // 累加
    14. sum += cur;
    15. // 加完再进入
    16. pQ.add(cur);
    17. }
    18. return sum;
    19. }