九度oj----哈夫曼数
来源:互联网 发布:centos7.2 网络配置 编辑:程序博客网 时间:2024/05/16 07:13
问题:
点击打开链接
- 题目描述:
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
- 输入:
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
- 输出:
输出权值。
- 样例输入:
5 1 2 2 5 9
- 样例输出:
37
- 来源:
- 2010年北京邮电大学计算机研究生机试真题
- 答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7895-1-1.html
解析:本体做法以建树进行;
每次先寻找两个最小的两个数(通俗上讲就是左儿子 lift 和右儿子 right ) 然后了两个数相加(得到一个父亲),用这个父亲作为左儿子,在剩余的数里再找到一个最小的数当作右儿子进行相加.......依次进行.....直到数据用完
#include<cstdio> #include<algorithm> #define m 0xfffffff /*32位最大正整数*/ using namespace std; struct huffman { int parent; int lchild; int rchild; int weight; }list[5000]; int main() { int sum=0;; int n,i,j,m1,m2,x1,x2,t; while(scanf("%d",&n)!=EOF) { sum=0; for(i=0;i<n;i++) scanf("%d",&list[i].weight); t=2*n-1; for(i=0;i<t;i++) { list[i].lchild=list[i].parent=list[i].rchild=-1; } for(i=0;i<n-1;i++) { x1=x2=0; m1=m2=m; for(j=0;j<n+i;j++) { if(list[j].weight<m1&&list[j].parent==-1) { x1=j; m1=list[j].weight; } else if(list[j].weight<m2&&list[j].parent==-1) { x2=j; m2=list[j].weight; } /*找出最小的两个数*/ } list[x1].parent=n+i; list[x2].parent=n+i; list[n+i].lchild=x1; list[n+i].rchild=x2; list[n+i].weight=list[x1].weight+list[x2].weight; sum+=list[n+i].weight; } printf("%d \n",sum); } return 0; }
阅读全文
1 0
- 九度oj----哈夫曼数
- 【九度OJ-1172】 哈夫曼数
- 【九度OJ】:九度OJ 1050
- 【九度OJ】:九度OJ 1053
- 【九度OJ】:九度OJ 1056
- 【九度OJ】:九度OJ 1059
- 【九度OJ】:九度OJ 1206
- 九度OJ:1000
- 【九度OJ】 1006
- 九度 OJ 1499
- 九度OJ-1002
- 九度OJ-1003
- 九度OJ 1004
- 九度OJ 1003
- 九度oj 采药
- 九度OJ 1001
- 九度OJ 1015
- 九度oj 1972
- 移动端禁止长按图片弹出菜单和禁止文本选择
- java中String、StringBuffer、StringBuilder的区别
- Android Study 之学(kao)习(bei)官方关于64k异常处理 ^_^
- java 垃圾回收
- TCP/UDP学习笔记
- 九度oj----哈夫曼数
- CentOS6.5 yum 出现 Error: requested datatype primary not available 的一个解决方案和手动安装【英文】man手册
- ngx映射到lua模块函数变量一览
- c++中string类的详解
- bellman ford算法
- 计算器
- java笔记(三)
- mysql函数大全
- spring概述介绍(一)