贪心算法-金条切割问题

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;
}
相关推荐
汉克老师5 分钟前
GESP7级C++考试语法知识(二、指数函数(3、综合练习)
c++·算法·数学建模·指数函数·gesp7级·复利
林间码客37 分钟前
04 ROC曲线与AUC:从零开始手动计算
大数据·人工智能·算法
Irissgwe42 分钟前
map/set/multimap/multiset 的底层逻辑与实现
数据结构·c++·算法·二叉树·stl·c·红黑树
IronMurphy1 小时前
【算法五十八】23. 合并 K 个升序链表
数据结构·算法·链表
思茂信息1 小时前
CST软件基于液态金属开关的方向图可重构天线
服务器·算法·重构·cst·仿真软件·电磁仿真
月疯1 小时前
PPG研究中暑的算法记录
算法
春日见1 小时前
vscode的AI编程插件推荐:
大数据·ide·vscode·算法·机器学习·编辑器·ai编程
blxr_2 小时前
力扣hot100路径总和Ⅲhttps://leetcode.cn/problems/path-sum-iii/
算法·leetcode·职场和发展
noipp2 小时前
【无标题】
c语言·数据结构·c++·算法
渡众机器人2 小时前
第八届全球校园人工智能算法精英大赛-算法应用赛-渡众机器人智能体对抗挑战赛规则
人工智能·算法·机器人·自动驾驶·自主导航·对抗赛