贪心算法-金条切割问题

1、题目描述

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

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

2、思路分析

通过小根堆,首先将所有数据加入到小根堆,

然后只要小根堆数据个数大于1,就弹出两个数并累加,

之后再把累加值放到小根堆里去,所有的累加和即为最小代价

3 代码实现:

c 复制代码
public static int lessMoney(int[] arr) {
    //1、准备一个小根堆
    PriorityQueue<Integer> pQ = new PriorityQueue<>();
    //2、把所有数字扔到小根堆中
    for (int i = 0; i < arr.length; i++) {
    pQ.add(arr[i]);
    }
    int sum = 0;
    int cur = 0;
    while (pQ.size() > 1) {
        //3、每次弹出两个数字进行结合
        cur = pQ.poll() + pQ.poll();
        sum += cur;
        //4、把结合的数扔到小根堆中
        pQ.add(cur);
    }
    return sum;
}
相关推荐
Q741_1474 分钟前
每日一题 力扣 3474. 字典序最小的生成字符串 贪心 字符串 C++ 题解
c++·算法·leetcode·贪心
人道领域5 分钟前
LeetCode【刷题日记】:螺旋矩阵逆向全过程,边界缩进优化
算法·leetcode·矩阵
ALex_zry8 分钟前
物联网数据质量控制系统设计:质控算法与实现
物联网·算法·struts
EQUINOX111 分钟前
货物运输问题,前缀和优化dp,[牛客周赛137 F-小苯的糖果盒]
算法·动态规划
小此方13 分钟前
Re:从零开始的 C++ STL篇(九)AVL树太“较真”,红黑树更“现实”:一文讲透工程中的平衡之道
开发语言·数据结构·c++·算法·stl
地平线开发者13 分钟前
多 Batch 量化校准与单 Batch 校准的数值差异
算法·自动驾驶
少许极端14 分钟前
算法奇妙屋(三十八)-贪心算法学习之路 5
java·学习·算法·贪心算法
im_AMBER17 分钟前
Leetcode 150 最小路径和 | 最长回文子串
数据结构·算法·leetcode
模拟器连接器曾工43 分钟前
AI视觉检测设备参数有哪些?从硬件到算法的全面解析
人工智能·算法·视觉检测·ai视觉·ai视觉检测
量子物理学44 分钟前
Open CV 边缘检测算法:Canny、Sobel、Scharr与Laplacian对比解析
人工智能·算法·计算机视觉