题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
输入输出格式
输入描述:
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出描述:
输出权值。
输入输出样例
输入样例#:
复制
5
1 2 2 5 9
输出样例#:
复制
37
题目来源
北京邮电大学
#include<iostream>
using namespace std;
void dubble(int *a,int low,int high){
for(int i = low+1;i <=high ;i++){
for(int j = low+1;j <= high-1 ;j++){
if(a[j] > a[j+1]){
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
return;
}
int main(){
int n; /*5 1 2 2 5 9*/
while(cin>>n){
int a[10000];
for(int i = 1;i <= n;i++){
cin>>a[i];
}
int low = 0, high = n,sum = 0,s = 0;
dubble(a,low,high);
while(low != high){ //动态变化得值
s = a[low+1] + a[low+2];
sum += s; //把前两个数字的和换成一个数字并与后面的数字排序组成新的有序
low += 2;
high++;
a[high] = s;
dubble(a,low,high);
if(low == high -1)
break;
}
cout<<sum<<endl;
}
return 0;
}