15. 计算WPL

来源:互联网 发布:windows程序设计如何 编辑:程序博客网 时间:2024/05/20 20:46

15. 计算WPL

成绩10开启时间2014年11月26日 Wednesday 17:25折扣0.8折扣时间2014年12月7日 Sunday 23:55允许迟交否关闭时间2014年12月14日 Sunday 23:55

Huffman编码是通信系统中常用的一种不等长编码,它的特点是:能够使编码之后的电文长度最短。

输入:
    第一行为要编码的符号数量n
    第二行~第n+1行为每个符号出现的频率

输出:
    对应哈夫曼树的带权路径长度WPL

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助测试用例 1以文本方式显示
  1. 5↵
  2. 7↵
  3. 5↵
  4. 2↵
  5. 4↵
  6. 9↵
以文本方式显示
  1. WPL=60↵
1秒64M0测试用例 2以文本方式显示
  1. 5↵
  2. 2↵
  3. 4↵
  4. 2↵
  5. 3↵
  6. 3↵
以文本方式显示
  1. WPL=32↵
1秒64M0
#include<stdio.h>#include<stdlib.h>typedef struct{unsigned int weight;unsigned int parent, lchild, rchild;}HTNode, *HuffmanTree;int min1, min2;int w[10000];void Select(HuffmanTree &HT, int i){int flag = 1200000000;int j;min1 = 0; min2 = 0;for (j = 0; j <= i; j++){if (HT[j].parent == 0 && HT[j].weight < flag){min1 = j;flag = HT[j].weight;}}flag = 1200000000;for (j = 0; j <= i; j++){if (HT[j].parent == 0 && HT[j].weight < flag){if (j != min1){min2 = j;flag = HT[j].weight;}}}}void BuildHuffmanTree(HuffmanTree &HT, int *w, int n){int m;int i;HuffmanTree p;m = 2 * n - 1;HT = (HuffmanTree)malloc((m + 1)*sizeof(HTNode));for (p = HT, i = 1; i <= n; ++i, ++p, ++w)*p = { *w, 0, 0, 0 };for (; i <= m+1; ++i, ++p)*p = { 0, 0, 0, 0 };for (i = n; i < m; ++i){Select(HT, i - 1);HT[min1].parent = i;HT[min2].parent = i;HT[i].lchild = min1;HT[i].rchild = min2;HT[i].weight = HT[min1].weight + HT[min2].weight;}}int Count(HuffmanTree &HT, int n){int count=0, flag;int i;for (i = 0; i < n; i++){flag = i;while (HT[flag].parent != 0){count += HT[i].weight;flag = HT[flag].parent;}}return count;}int main(){int n;int i;int WPL;HuffmanTree HT;scanf("%d", &n);for (i = 0; i < n; i++)scanf("%d", &w[i]);BuildHuffmanTree(HT, w, n);if (n == 1)printf("WPL=%d\n", w[0]);else{WPL = Count(HT, n);printf("WPL=%d\n", WPL);}return 0;}

0 0
原创粉丝点击