BUAA 702水题-哈夫曼(小顶堆或者优先队列解决)

原创 2013年12月05日 23:41:10

柯南之合并

Description

柯南发现一个果园,果园中每个果子都有一个记号,有些果子记号相同,于是柯南认为这些果子是犯人传递消息的工具,所以柯南把所有的果子打了下来,而且按果子的不同种类分成了不同的堆。调查完后柯南要把所有的果子合成一堆,送回果园。
  每一次合并,柯南可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。柯南在合并果子时总共消耗的体力等于每次合并所耗体力之和。
  因为还要花大力气把这些果子搬回果园,所以柯南在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使柯南耗费的体力最少,并输出这个最小的体力耗费值。
  例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以柯南总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

Input

输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。

Output

输出包括一行(不用回车),这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。

Sample Input

3 
1 2 9

Sample Output

15

 

#include <cstdio>
#include <queue>

using namespace std;

typedef long long LL;

priority_queue<LL ,vector<LL>,greater<LL> >q;//建立小顶堆;
long long n,ans;

int main()
{
    while(scanf("%lld",&n)!=EOF)
    {
        while(!q.empty())
            q.pop();
        for(int i=1;i<=n;i++)
        {
            long long x;
            scanf("%lld",&x);
            q.push(x);
        }
        ans=0;
        while(q.size()>1)
        {
            LL a=q.top();
            q.pop();
            LL b=q.top();
            q.pop();
            ans+=(a+b);
            q.push(a+b);
        }
        printf("%lld\n",ans);
    }
    return 0;
}


 

 

哈夫曼树--九度 1172 & 1107 [优先队列实现小顶堆]

题目:http://ac.jobdu.com/problem.php?pid=1172哈夫曼树的最小权值 = sum(叶节点权值 * 路径长度)思路: 1、把候选节点放入队列中; 2、每次取出两个...
  • qq_26398495
  • qq_26398495
  • 2017年02月25日 09:38
  • 340

优先队列及最小堆最大堆

1 堆     1.1 简介 n个关键字序列Kl,K2,…,Kn称为(Heap),当且仅当该序列满足如下性质(简称为堆性质): (1)ki=号。//k(i)相当于二叉树的非叶结点,K(2i)则是左孩子...
  • zhang20072844
  • zhang20072844
  • 2013年08月25日 15:03
  • 24369

优先队列实现 哈夫曼编码

用到了优先队列的知识点,还有dfs算法。 优先队列主要是为了查找最小权重树的时候方便查找,不用耗费很多的时间从已经产生的树种依次查找, 具体实现看代码。 dfs主要是用来遍历树从而拿到每个字符的...
  • TchChan
  • TchChan
  • 2017年05月19日 16:43
  • 422

哈夫曼编码问题再续(下篇)——优先队列求解

上篇描述了哈夫曼编码问题的基本描述以及建造一个哈夫曼树的过程分析,那么当算法已经描述清楚之后,我们要怎么样来实现 代码呢?或者说,给你一些带有权值的叶子节点,要怎么样利用程序快速算出所对应的哈夫曼树...
  • liujian20150808
  • liujian20150808
  • 2016年03月30日 22:21
  • 1568

水题——优先队列

Description 因为是有关于接水的问题,便简称为水题了(。 N个人排队在M个出水口前接水,第i个人接水需时为t[i], 请问接水的最短用时是多少? Input 第一行一个整数 T ,代...
  • StubbornAccepted
  • StubbornAccepted
  • 2016年04月20日 21:32
  • 274

hdu 1873 优先队列水题

看病要排队 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su...
  • mazicwong
  • mazicwong
  • 2016年09月24日 16:24
  • 159

优先队列解决哈夫曼编码问题

#include using namespace std; class Heap { private: int *data, size; public: Heap(int length...
  • qq_33665647
  • qq_33665647
  • 2016年03月19日 22:53
  • 151

优先队列的STL运用与哈夫曼树的实现

priority_queue是优先队列,简称堆,哈夫曼树的实现需要依靠于堆的操作 堆是一颗二叉树,看似队列又非队列,其具有一定的排列性,我们将从STL库中的priority_queue来进行讲解 ...
  • yyb0802
  • yyb0802
  • 2017年10月31日 20:12
  • 81

hdoj 3785 寻找大富翁 【水题】【优先队列 or sort】

寻找大富翁 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年07月29日 11:39
  • 274

利用优先队列编写哈夫曼树和编码

利用“有序链表”来实现优先队列,链表元素按优先级递减。元素出列即出首元素,元素入列即将元素插入有序链表使其依然有序。本程序中,字符频率小则优先级高。 typedef int PQElemType...
  • S2637281620
  • S2637281620
  • 2016年11月17日 19:16
  • 566
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BUAA 702水题-哈夫曼(小顶堆或者优先队列解决)
举报原因:
原因补充:

(最多只允许输入30个字)