【哈弗曼树】 WOJ2343 围栏维修

本文介绍了一个关于围栏维修的问题,农民John需要锯木材来修复围栏,通过利用哈弗曼树的原理,寻找锯木头的最小总花费策略,帮助农民John确定最佳的锯木顺序,以达到最小成本的目标。该问题转化为构建一个有n个叶子节点的二叉树,通过堆来维护最小的两个节点进行合并,确保总费用最小。
摘要由CSDN通过智能技术生成

【描述】

农民 John 希望修复围绕农场的一小段围栏。他测量了一下,发现需要N (1 <= N <= 20,000) 根木头,每根都有某一个整数长度 Li (1 <= Li <= 50,000) 单位长度。 他买了一根很长的很长的木头,正好能够锯出他所需要的N根木头。(即它的长度正好等于 Li的总和) FJ 忽略锯口,锯掉的木屑产生的长度损失忽略不计,你也可以忽略它。

FJ 遗憾的发现他自己没有用于切木头的锯子,所以他就带着那根很长的木头来到了农民 Don 的农场,想问他借一个锯子。

农民 Don是一个保守的资本家,他不愿意借锯子给 FJ ,但愿意自己来切这N-1刀,每一次 都向FJ收取费用。每次的收费正好等于你要锯的那根木头的总长度。例如,你要锯一根长度 为21的木头,就花费21分钱。

农民 Don 然后让农民 John 自己决定每次锯木头的顺序和位置。帮助农民 John 确定锯出 这N根木头的最小总花费。 FJ 知道可以有很多种不同的切割方式,不同的方式可能得到 不同的总花费,这是因为木头在锯的过程中的长度不一。

【输入】

  • Line 1: 一个整数 N,表示要锯出的木头数

  • Lines 2..N+1: 每行一个整数,表示每根木头的长度。

【输出】

  • Line 1: 一个整数,表示他最少需要多少分钱,锯N-1下,锯出所有需要的木头。

【样例输入】[复制]

3
8
5
8

【样例输出】[复制]

34

【提示】

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值