贪心算法-金条切割问题

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;
}
相关推荐
逆境不可逃8 分钟前
LeetCode 热题 100 之 138. 随机链表的复制 148. 排序链表 23. 合并 K 个升序链表 146. LRU 缓存
算法·leetcode·职场和发展
Q741_14710 分钟前
每日一题 力扣 3546. 等和矩阵分割 I 前缀和 贪心 剪枝 C++ 题解
算法·leetcode·前缀和·矩阵·剪枝·贪心
我是咸鱼不闲呀11 分钟前
力扣Hot100系列23(Java)——[回溯]总结(上)(全排列,子集,电话号码的字母组合,组合总和)
java·算法·leetcode
tobias.b13 分钟前
深度学习 超清晰通俗讲解 + 核心算法 + 使用场景
人工智能·深度学习·算法
七夜zippoe15 分钟前
量子计算入门:Qiskit框架实战
python·算法·量子计算·ibm·qiskit
小此方15 分钟前
Re:从零开始的 C++ STL篇(八)深度解构AVL树自平衡机制:平衡维护与旋转调整背后的严密逻辑
开发语言·数据结构·c++·算法·stl
2301_7890156215 分钟前
封装哈希表实现unordered_set/undered_map
c语言·数据结构·c++·算法·哈希算法
落羽的落羽17 分钟前
【Linux系统】中断机制、用户态与内核态、虚拟地址与页表的本质
java·linux·服务器·c++·人工智能·算法·机器学习
神工坊18 分钟前
技术分享︱多重参考系模型在风扇通风仿真中的自动化实现:精度与效率的工程平衡
算法·hpc·并行计算·cfd·cae·流体力学·风扇仿真