題目描述:
哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。
輸入:
輸入有多組資料。
每組第一行輸入乙個數n,接著輸入n個葉節點(葉節點權值不超過100,2<=n<=1000)。
輸出:
輸出權值。
樣例輸入:
5
1 2 2 5 9
樣例輸出:
37
這個題可以建樹也可以不建樹。
不建樹比較容易。首先要明確,題目要求輸出的乘積之和,其實就是哈夫曼樹中去除葉節點之外,其他節點的值的和。比如
題目要求意思是 1*4+2*4+2*3+5*2+9*1=37
其實可以直接 3+5+10+19=37
明白了這一點,就可以直接排序,每次取陣列中最小的兩個數,然後相加,並累加,最終就得到了輸出。**如下:
#include
#include
using
namespace
std;
int main();
scanf("%d", &n);
for(int i=0; iscanf("%d", &node[i]);
}for (int i = 0; i < n - 1; i++)
printf("%d\n", result);
return
0;}
建哈夫曼樹的話,其實也是每次計算最小的兩個,然後把他們的和累加,建樹反而比較麻煩,最終的計算也是 3+5+10+19=37。**如下:
#include
using
namespace
std;
struct huffman;
int main()
for (int i = 0; i < n; i++)
for (int i = 0; i < n - 1; i++)
else
if (node[j].weight < x2 && node[j].parent == -1)
}//經過這次迴圈,找到了最小和次小
node[n + i].weight = x1 + x2; //這五行是建樹,將最小的兩個相加,增加新節點
node[n + i].lchild = m1;
node[n + i].rchild = m2;
node[m1].parent = n + i;
node[m2].parent = n + i;
result += node[n + i].weight;
}printf("%d\n", result);
return
0;}
九度 題目1172 哈夫曼樹
時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 4471 解決 1889 題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行...
九度OJ1172 哈夫曼樹
題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出 輸出...
九度OJ 1172 哈夫曼樹
由於建立的哈夫曼樹不唯一,所以機試多考察哈夫曼樹的帶權路徑長度和,如此題。此問題最終轉化為利用堆模擬建樹過程,求出非葉節點的權值和 該哈夫曼樹的帶權路徑長度和 無需作出哈夫曼樹的具體結構體 收穫如下 關於哈夫曼樹 該樹非葉節點的權值和 該哈夫曼樹的帶權路徑長度和 關於堆排序 堆排序建堆o n log...