算法练习day14——190402(贪心:切金条、做项目、会议室安排)

本文介绍了三个使用贪心算法解决的实际问题:如何以最小代价切割金条、如何最大化有限资金下的项目收益,以及如何高效安排会议室。每个问题都从分析、举例和代码实现三个方面进行了详细讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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铜板。

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

1.1 分析

这是一个标准的哈夫曼问题:两个叶节点合并的时候,代价就是叶节点之和。

给定10,20,30,构成一个数,使得所有非叶节点之和最小。

解题思路:

给定一组数:{1,2,6,4,3,7,1,8},然后将这组数构成一个小根堆。每次从小根堆中拿出两个数。

第一次拿的肯定是两个1。这两个1生成一个节点,代价为2。然后把这个2扔回到小根堆中。

接着拿出两个数:两个2,这两个2合并的代价为4,然后将4扔回到小根堆中。。。。

最终得到的结果:

贪心:在所有的数中总是拿两个最小的。

此题中,切割的顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值