贪心算法-金条切割问题

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;
}
相关推荐
程序员-King.几秒前
day140—前后指针—删除排序链表中的重复元素Ⅱ(LeetCode-82)
数据结构·算法·leetcode·链表
小尧嵌入式1 分钟前
【Linux开发一】类间相互使用|继承类和构造写法|虚函数实现多态|五子棋游戏|整数相除混合小数|括号使用|最长问题
开发语言·c++·算法·游戏
BHXDML7 分钟前
第三章:聚类算法
算法·机器学习·聚类
仙俊红16 分钟前
二分查找边界模板:第一个 > target / 第一个 < target(找不到就返回边界)
算法
苦藤新鸡18 分钟前
16.求数组除了当前元素的所有乘积
算法·leetcode·动态规划
Benny_Tang19 分钟前
题解:P14841 [THUPC 2026 初赛] 哈姆星与古地球学术行为影响星球文明的考古学分析
c++·算法
WilliamHu.19 分钟前
A2A协议
java·数据结构·算法
Tisfy24 分钟前
LeetCode 1895.最大的幻方:暴力中来点前缀和优化
算法·leetcode·前缀和·矩阵·题解·暴力
deng120430 分钟前
【排序算法总结(1)】
java·算法·排序算法
Remember_99334 分钟前
【数据结构】Java数据结构深度解析:栈(Stack)与队列(Queue)完全指南
java·开发语言·数据结构·算法·spring·leetcode·maven