/*题目描述:
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。
输入:
输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。
输出:
输出权值。
样例输入:
5
1 2 2 5 9
样例输出:
37*/
#include <iostream>
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
int n;
vector<int > tree;
vector<int >::iterator p;
while(scanf("%d",&n)!=-1)
{
int sum=0;
for(int i=0;i<n;i++)
{
int m;
scanf("%d",&m);
tree.push_back(m);
}
if(tree.size()==1)
{
// sum=tree[0];
goto end;//只有一个节点时,直接计算权值
}
sort(tree.begin(),tree.end());//从小到大排序
p=tree.begin();
while(tree.size()!=1)
{
sum=tree[0]+tree[1]+sum;//每一次都将前面的结果进行累加,即为权值公式
//tree.push_back(tree[0]+tree[1]);
int temp=tree[0]+tree[1];
for(int i=0;i<tree.size()-1;i++)
{
if(temp>=tree[i]&&temp<=tree[i+1])//比较前两个较小节点之和与后面的两个节点
{
tree.insert(tree.begin()+i+1,temp);
break;
}
else if(temp<tree[0])//可能存在负数
{
tree.insert(tree.begin(),temp);
break;
}
else if(temp>tree[tree.size()-1])
{
tree.insert(tree.end(),temp);
break;
}
}
tree.erase(p,p+2);//删除已经进行累加的两个较小节点
//sort(tree.begin(),tree.end());
p=tree.begin();
}
end: cout<<sum<<endl;
// tree.empty();
tree.clear();
}
return 0;
}
九度oj:求哈夫曼树(vector)
最新推荐文章于 2023-07-09 17:31:42 发布