题意:给你n块长度已知的木板,已知FJ每次能连接两个木板成为一个新的木板,
新的木板长度为两块木板之和。问FJ把n块木板连接起来成最后的一块木板的长度最小
新的木板长度为两块木板之和。问FJ把n块木板连接起来成最后的一块木板的长度最小
题解:
(1)将初始数据看成是有n 棵树的森林(每棵树仅有一个结点);
(2)选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,
且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为 哈夫曼树
//----其实此题只是沿用哈弗曼树的形式计算值而已,并不需要真正建树
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>`
#include <algorithm>
#include <cctype>
#include <queue>
#include <vector>
#define INF 0x7fffffff
#define eps (1e-9)
#define clearto(s,x) memset(s,x,sizeof(s))
using namespace std;
typedef long long llong;
int n,m,tot=0;
int main()
{
//freopen("D:\data.txt","r",stdin);
int TT,i,k,t;
priority_queue<llong,vector<llong>,greater<llong> > q;
while(~scanf("%d",&n)&&n)
{
long long tt,ans=0;
for(i=0;i< n;i++) { scanf("%lld",&tt); q.push(tt); }
while(q.size()>1){
tt =q.top(); q.pop();
tt+=q.top(); q.pop();
ans+=tt; q.push(tt);
}
//ans +=q.top();
printf("%lld",ans);
}
return 0;
}