切金条

题目(算法课第八课)

一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为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铜板。

给定数组{10,20,30}

输入一个数组,返回分割的最小代价。

分析

这是一个典型的哈夫曼问题,哈夫曼的思想就是这个题目的贪心策略。

做法

  1. 从一组数据里面每次拿出最小的两个数
  2. 相加再放进数组里
  • 直到只剩下一个数据为止
  • 他的所有叶子节点到根节点的代价一定是最小的

代码实现

import java.util.PriorityQueue;

public class LessMoney{
    public static int lessMoney(int[]arr){
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>(); //使用优先级队列
        int res = 0;
        int cur = 0;
        for (int i = 0; i < arr.length; i++) {
            pq.add(arr[i]);
        }
        while(pq.size()>1){
        //1-------------------------------------------------------------
            cur = pq.poll()+pq.poll();
            res += cur;
       //2-------------------------------------------------------------
            pq.add(cur);
        }
        return res;
    }
    public static void main(String[] args) {
        int arr[] = new int[] { 10, 20, 30 };//90
        System.out.println(lessMoney(arr));
    }
}
测试结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.随时找到数据流的中位数 【题目】有一个源源不断地吐出整数的数据流,假设你有足够的空间来保存吐出的数。请设计一个...
    Miss_麦兜阅读 1,126评论 0 1
  • 贪心的过程要么是最大要么是最小,堆可以很好的满足这个要求。 问题1:一块金条切成两半,是需要花费和长度数值一样的铜...
    放开那个BUG阅读 357评论 0 0
  • 急性子的女人往往给我们留下的都是一种做什么事都风风火火,行动快过大脑的印象,不怎么讨人喜欢。其实,急性子的女人有许...
    灵秀世佳_马易云阅读 1,009评论 0 0
  • 在军校调整改革大潮中,有人叹息“母校没了”,有人庆幸 “母校还在”。无论“母校”何去何从,我们对她的记忆不会因岁月...
    弘毅剑心阅读 3,675评论 1 3
  • 当机智的网友们把“520”译为“我爱你”后,这个普通的日子便成为一个浪漫的节日,其受追捧的程度大有超越“2·14”...
    趣读书吧阅读 223评论 0 0

友情链接更多精彩内容