输入一个数组,返回分割的最小代价。 --贪心算法

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

实际上这里等同于如何把数组里三个值花费最小代价拼成60
这里仿照建树规则,新建立的结点值加在一起即是花费的钱数
具体方法,每次从数组中拿两个最小值建树,新得到的值再加入树中,依次类推,直到树得到根.

代码

package com.algorithm.practice.heap;

import java.util.PriorityQueue;

public class LessMoney {
    public static int lessMoney(int[] arr){
        if (arr==null||arr.length==0){
            return 0;
        }
        PriorityQueue<Integer> queue=new PriorityQueue<>();
        for(int i=0;i<arr.length;i++){
            queue.add(arr[i]);
        }
        int cos=0;
        while (queue.size()>1){
            int min1=queue.poll();
            int min2=queue.poll();

            cos+=min1+min2;
            queue.add(min1+min2);
        }
        return cos;
    }
    public static void main(String[] args){
        int[] arr = { 6, 7, 8, 9 };//13 17 30
        System.out.println(lessMoney(arr));

        int[] arrForHeap = { 3, 5, 2, 7, 0, 1, 6, 4 };
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 年轻即出发... 简书:https://www.jianshu.com/u/7110a2ba6f9e 知乎:htt...
    囧么肥事阅读 2,854评论 0 1
  • 贪心的过程要么是最大要么是最小,堆可以很好的满足这个要求。 问题1:一块金条切成两半,是需要花费和长度数值一样的铜...
    放开那个BUG阅读 2,563评论 0 0
  • 1.随时找到数据流的中位数 【题目】有一个源源不断地吐出整数的数据流,假设你有足够的空间来保存吐出的数。请设计一个...
    Miss_麦兜阅读 4,711评论 0 1
  • 第四天 数组【悟空教程】 第04天 Java基础 第1章数组 1.1数组概念 软件的基本功能是处理数据,而在处理数...
    Java帮帮阅读 5,525评论 0 9
  • 题目(算法课第八课) 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的 金条,不管切成长度多大...
    stoneyang94阅读 3,486评论 0 0

友情链接更多精彩内容