Advertisement

10. 计算WPL

阅读量:

Huffman编码是一种广泛应用在通信系统中的变长编码方法。其核心优势在于:通过优化字符编码比例,能够实现对信息进行最小化总码长的有效编码。

测试用例1:
输入:
5
7
5
2
4
9
输出:
WPL=60

测试用例2:
输入:
5
2
4
2
3
3
输出:
WPL=32

测试用例3:
输入:
1
15
输出:
0

解析:这道题目与上学期程设中的一道题《郭老师家的果园》有相似之处。以数值序列75249为例,在初始状态下需要完成一系列的操作以达到最终目标。首先找出序列中的前两个最小值(即24),然后进行一次合并操作(将它们与相邻元素结合形成新的子序列)。接着,在新的序列中再次找出前两个最小值(即56),进行二次合并操作;随后,在新的序列中再次找出前两个最小值(即79)进行第三次合并操作……特别地,在整个过程中若只剩下单一数字,则无需任何操作;最终总耗能即为所有步骤中所累加的结果。

代码

复制代码
    #include<stdio.h>
    #include<stdlib.h>
    #include<limits.h>
    
    int last = 0, sum = 0, len;
    void FindMin(int num[])
    {
    int x1 = last, x2 = last;
    int min = num[last];//定义最小
    int min2 = INT_MAX;//定义第二最小
    for (int i = last; i <len; i++)
    {
        if (num[i]<min)
        {
            min = num[i];
            x1 = i;
        }
    }//获得最小
    for (int i = last; i < len; i++)
    {
        if (num[i] <= min2 && i != x1)
        {
            min2 = num[i];
            x2 = i;
        }
    }//获得第二小
    num[x2] = min + min2;
    sum += num[x2];
    if (x2 == last)
        num[x1] = num[x2];
    else
        num[x1] = num[last];
    num[last] = 0;
    last++;
    }
    int main()
    {
    int n;
    int num[10005] = { 0 };
    scanf("%d", &n);
    len = n;
    if (len == 1)
    {
        printf("%d\n", num[0]);
        return 0;
    }
    for (int i = 0; i < n; i++)
        scanf("%d", &num[i]);
    
    while (n > 1)
    {
        FindMin(num);
        n--;
    }
    printf("WPL=%d\n", sum);
    //system("pause");
    return 0;
    }

全部评论 (0)

还没有任何评论哟~