POJ Fence Repair-哈夫曼树思想

题意:给你n块长度已知的木板,已知FJ每次能连接两个木板成为一个新的木板,
          新的木板长度为两块木板之和。问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;
}


你可能感兴趣的:(数据结构)