• 贪心算法-金条切割问题


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

    solution:

    1、准备一个小根堆
    2、把所有树放到小根堆中 3、然后依次弹出两个数,求和 4、把和扔到小根堆中 循环3、4步骤

    代码:

    package Algorithms.greed;
    
    import java.util.PriorityQueue;
    
    public class LessMoneySplitGold {
    
        public static int lessMoney(int[] arr) {
            PriorityQueue<Integer> pQ = new PriorityQueue<>(); //1、准备一个小根堆
            for (int i = 0; i < arr.length; i++) { //2、把所有数字扔到小根堆中
                pQ.add(arr[i]);
            }
            int sum = 0;
            int cur = 0;
            while (pQ.size() > 1) {
                cur = pQ.poll() + pQ.poll(); //3、每次弹出两个数字进行结合
                sum += cur;
                pQ.add(cur); //4、把结合的数扔到小根堆中
            }
            return sum;
        }
    
    
        public static void main(String[] args) {
            // solution
            int[] arr = {6, 7, 8, 9};
            System.out.println(lessMoney(arr)); //60
        }
    }
    package Algorithms.greed;
    
    import java.util.Arrays;
    import java.util.Comparator;
    import java.util.LinkedList;
    import java.util.PriorityQueue;
    
    public class LessMoneySplitGold {
    
        public static int lessMoney(int[] arr) {
            //1、准备一个小根堆
            //PriorityQueue<Integer> pQ = new PriorityQueue<>();
            Arrays.sort(arr);
            LinkedList<Integer> q = new LinkedList<>();
    
            for (int i = 0; i < arr.length; i++) { //1、把所有数字扔到小根堆中
                q.add(arr[i]);
            }
            int sum = 0;
            int cur = 0;
            while (q.size() > 1) {
                cur = q.poll() + q.poll(); //2、每次弹出两个数字进行结合
                System.out.println(cur);
                sum += cur;
                q.add(cur); //3、把结合的数扔到小根堆中
            }
            return sum;
        }
    
        //比较器构建小根堆
        public static class MinheapComparator implements Comparator<Integer> {
    
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2; // < 0  o1 < o2  负数
            }
    
        }
    
        //比较器构建大根堆
        public static class MaxheapComparator implements Comparator<Integer> {
    
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1; // <   o2 < o1
            }
    
        }
    
        public static void main(String[] args) {
            // solution
            int[] arr = { 6, 7, 8, 9 };
            System.out.println(lessMoney(arr));  // 60
    
            int[] arrForHeap = { 3, 5, 2, 7, 0, 1, 6, 4 };
    
            // min heap
            PriorityQueue<Integer> minQ1 = new PriorityQueue<>();
            for (int i = 0; i < arrForHeap.length; i++) {
                minQ1.add(arrForHeap[i]);
            }
            while (!minQ1.isEmpty()) {
                System.out.print(minQ1.poll() + " "); //0 1 2 3 4 5 6 7
            }
            System.out.println();
    
            // min heap use Comparator
            PriorityQueue<Integer> minQ2 = new PriorityQueue<>(new MinheapComparator());
            for (int i = 0; i < arrForHeap.length; i++) {
                minQ2.add(arrForHeap[i]);
            }
            while (!minQ2.isEmpty()) {
                System.out.print(minQ2.poll() + " ");  //
            }
            System.out.println();
    
            // max heap use Comparator
            PriorityQueue<Integer> maxQ = new PriorityQueue<>(new MaxheapComparator());
            for (int i = 0; i < arrForHeap.length; i++) {
                maxQ.add(arrForHeap[i]);
            }
            while (!maxQ.isEmpty()) {
                System.out.print(maxQ.poll() + " ");
            }
    
        }
    }
    
    /**
     * 13
     * 17
     * 30
     * 60
     * 0 1 2 3 4 5 6 7 
     * 0 1 2 3 4 5 6 7 
     * 7 6 5 4 3 2 1 0 
     */
    大根堆、小根堆的构建
  • 相关阅读:
    shell进行mysql统计
    java I/O总结
    Hbase源码分析:Hbase UI中Requests Per Second的具体含义
    ASP.NET Session State Overview
    What is an ISAPI Extension?
    innerxml and outerxml
    postman
    FileZilla文件下载的目录
    how to use webpart container in kentico
    Consider using EXISTS instead of IN
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/15143279.html
Copyright © 2020-2023  润新知