题目1172:哈夫曼树(最短路径的和)两种方法解决

来源:互联网 发布:卷积深度信念网络 编辑:程序博客网 时间:2024/05/30 05:42
题目1172:哈夫曼树

时间限制:1 秒

内存限制:32 兆

特殊判题:

题目描述:

哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。

输入:

输入有多组数据。
每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。

输出:

输出权值。

样例输入:
5  1 2 2 5 9
样例输出:
37
#include <iostream>#include<stdio.h>#include<queue>using namespace std;priority_queue<int,vector<int>, greater<int> > Q;//建立一个小顶堆,注意最后的> >要分开写int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        while(Q.empty()==false) Q.pop();//清空堆中元素        for(int i=0; i<n; i++)        {            int x;            scanf("%d",&x);            Q.push(x);//权值放入堆中        }        int ans=0;        while(Q.size()>1)        {            int a=Q.top();            Q.pop();            int b=Q.top();            Q.pop();            ans+=a+b;//父亲节点必为非叶子节点,故累加其权值            Q.push(a+b);//将双亲节点的权值放回堆中        }        printf("%d\n",ans);    }    return 0;}

 

#include <iostream>#include<stdio.h>#include<queue>#include<algorithm>using namespace std;int a[102];bool  cmp(int a,int b){    return a<b;} int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);        }         int sum=0;        for(int i=0;i<n-1;i++)        {            sort(a,a+n,cmp);//每一次都要重新排序            a[i+1]+=a[i];            sum+=a[i+1];        }        printf("%d\n",sum);    }    return 0;} /**************************************************************    Problem: 1172    User: zhuoyuezai    Language: C++    Result: Accepted    Time:30 ms    Memory:1520 kb****************************************************************/

 

0 0
原创粉丝点击