问题背景:
Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}
中。这个过程的费用记为pa + pb。
2. 重复步骤1,直到{pi}中只剩下一个数。
在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
本题任务:
对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用,构造示例参考下图。
解题思路:
对于这一题,我们可以采用qsort函数进行排序,并设计精简操作代码即可。
参考代码:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int compare (const void * a, const void * b) //small-> big 5 { 6 return *((int*)a)-*((int*)b); 7 } 8 int main(){ 9 int num,i; 10 scanf("%d",&num); 11 int* numlist=(int*)malloc(sizeof(int)*num); 12 for(i=0;i<num;i++) 13 scanf("%d",&numlist[i]); 14 int sum=0,temp; 15 while(num>1) 16 { 17 qsort(numlist,num,sizeof(int),compare); //SORT 18 temp=numlist[0]+numlist[1]; 19 sum+=temp;//Two Small Number Add 20 numlist=numlist+1; 21 *numlist=temp; 22 num--; 23 } 24 printf("%d",sum); 25 return 0; 26 }
时间: 2024-11-13 09:38:01