博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
贪心:huffman编码
阅读量:4216 次
发布时间:2019-05-26

本文共 917 字,大约阅读时间需要 3 分钟。

题目:一位老木匠需要将一根长的木棒切成N段。每段的长度分别为L1,L2,......,LN(1 <= L1,L2,…,LN <= 1000,且均为整数)个长度单位。我们认为切割时仅在整数点处切且没有木材损失。

木匠发现,每一次切割花费的体力与该木棒的长度成正比,不妨设切割长度为1的木棒花费1单位体力。例如:若N=3,L1 = 3,L2 = 4,L3 = 5,则木棒原长为12,木匠可以有多种切法,如:先将12切成3+9.,花费12体力,再将9切成4+5,花费9体力,一共花费21体力;还可以先将12切成4+8,花费12体力,再将8切成3+5,花费8体力,一共花费20体力。显然,后者比前者更省体力。

那么,木匠至少要花费多少体力才能完成切割任务呢?
输入

第1行:1个整数N(2 <= N <= 50000)第2 - N + 1行:每行1个整数Li(1 <= Li <= 1000)。

输出

输出最小的体力消耗。

输入示例

3345

输出示例

19

题目意思可转化为给了huffman的叶子节点,让你求权重和

可以从最底层叶子考虑,每两个叶子节点都是由上一个切割出来,花费的力量就是二者之和,依次在把和放入优先队列,直到队列只剩下一个元素,此时sum就是最终结果
#include
using namespace std;int n;priority_queue
,greater
> pq;int main() { cin >> n; int x; for(int i = 0; i < n; ++i){ scanf("%d",&x); pq.push(x); } long long sum = 0; while(pq.size() > 1){ int l1 = pq.top(); pq.pop(); int l2 = pq.top(); pq.pop(); pq.push(l1+l2); sum += (l1+l2); } printf("%d\n",sum); return 0; }

转载地址:http://lhimi.baihongyu.com/

你可能感兴趣的文章
男人的品位--我们自己的最求
查看>>
Android (Linux) Suspend流程
查看>>
LINUX时间管理
查看>>
定时器的使用
查看>>
为Android加入busybox工具
查看>>
使用技巧busybox
查看>>
如何查看与/dev/input目录下的event对应的设备
查看>>
bootloader-bootable解析
查看>>
bootloader (LK)&&android lk bootloader中相关修改指南
查看>>
SD卡驱动分析--基于高通平台
查看>>
SD Card 驱动流程分析
查看>>
Linux之debugfs介绍
查看>>
关于sd卡中一些概念的理解
查看>>
sd卡驱动分析之相关硬件操作和总结
查看>>
好的播文
查看>>
linux dd命令解析
查看>>
linux find命令详解
查看>>
S3C2440上touchscreen触摸屏驱动
查看>>
USB History Viewing
查看>>
怎样做可靠的分布式锁,Redlock 真的可行么?
查看>>