前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >输入一个数组,返回分割的最小代价。 --贪心算法

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

作者头像
名字是乱打的
发布2022-05-13 09:39:05
4690
发布2022-05-13 09:39:05
举报
文章被收录于专栏:软件工程

题目 : 一块金条切成两半,是需要花费和长度数值一样的铜板的。 比如长度为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 这里仿照建树规则,新建立的结点值加在一起即是花费的钱数 具体方法,每次从数组中拿两个最小值建树,新得到的值再加入树中,依次类推,直到树得到根.

代码

代码语言:javascript
复制
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 };
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档