题目描述:

哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。

输入:

输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。

输出:

输出权值。

样例输入:
5  
1 2 2 5 9
样例输出:
37

有一个特别简单的方法:最小带权路径长度为非叶子结点的和 ,即   WPL= 19 + 10 +5 +3=37

代码如下:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n,res;
 8     int a[1001];
 9     while(cin>>n)
10     {
11         res = 0;
12         for(int i = 0; i < n; i++)
13             cin>>a[i];
14 
15         for(int i = 1; i < n; i++)
16         {
17             sort(a+i-1, a+n);
18             res += a[i]+a[i-1];
19             a[i] = a[i] + a[i-1];
20         }
21         cout<<res<<endl;
22     }
23 }
View Code

 

posted on 2017-09-03 20:21  小小糖果tt  阅读(86)  评论(0)    收藏  举报