POJ Fence Repair-哈夫曼树思想

来源:互联网 发布:js获取style 编辑:程序博客网 时间:2024/06/15 03:31
题意:给你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;}


0 0