树-堆结构练习——合并果子之哈夫曼树

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem 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

Hint

Source

赵利强

#include <bits/stdc++.h>
using namespace std;
int main()
{priority_queue<int, vector<int>, greater<int>> q; // 升序的优先队列int n, num;cin >> n;for (int i = 0; i < n; i++){cin >> num;q.push(num);}int ans = 0;while (!q.empty()){int a = q.top();q.pop();if (!q.empty()){int b = q.top();q.pop();ans += a + b;q.push(a + b);}}cout << ans << endl;return 0;
}

建立堆解法:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>using namespace std;struct N
{int data;N *l, *r;
};struct N *creat()
{N *p = (N *)malloc(sizeof(N));p->l = p->r = NULL;return p;
}void insert(N *&root, int data)
{if (root == NULL){root = creat();root->data = data;}else if (data >= root->data){insert(root->r, data);}else{insert(root->l, data);}
}int check(N *&root)
{if (root->l == NULL){int t = root->data;root = root->r;return t;}elsereturn check(root->l);
}int main()
{int n, t, i, sum = 0;cin >> n;N *root = NULL;for (i = 0; i < n; i++){cin >> t;insert(root, t);}int a, b;for (i = 1; i < n; i++){a = check(root);b = check(root);sum += a + b;insert(root, a + b);}cout << sum << endl;return 0;
}

转载于:https://www.cnblogs.com/iQXQZX/p/10258725.html

SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)相关推荐

  1. 树-堆结构练习——合并果子之哈夫曼树

    树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...

  2. 树-堆结构练习——合并果子之哈夫曼树(是最优二叉树题目的缩影)

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个果园里,多多已经将所有的果子 ...

  3. 树-堆结构练习——合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descrip

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descrip ...

  4. 树-堆结构练习——合并果子之哈夫曼树oj

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 在一个果园里,多多已经将所有的果子打了下 ...

  5. L - 树-堆结构练习——合并果子之哈夫曼树

    L - 树-堆结构练习--合并果子之哈夫曼树 题目链接: link. 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合 ...

  6. java合并果子_C++(STL)树-堆结构练习——合并果子之哈夫曼树

    priority_queue 对于基本类型的使用方法相对简单. 他的模板声明带有三个参数,priority_queue Type 为数据类型, Container 为保存数据的容器,Functiona ...

  7. sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列

    Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...

  8. Vijos P1097 合并果子【哈夫曼树+优先队列】

    描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  9. 哈夫曼树编码和译码c语言,C++哈夫曼树编码和译码的实现

    78 /*-----------创建工作---------------------------*/ 79     int s1,s2; 80     for (int i = n + 1; i < ...

最新文章

  1. AAAI-19 日程 安排
  2. Java机器学习库ML之一Dataset和Instance
  3. CircleList
  4. SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇
  5. [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案?
  6. LeetCode 557. Reverse Words in a String III
  7. Flutter中Widget 、Element、RenderObject角色深入分析
  8. java web开发中会遇到的异步执行方案
  9. python 如何判断字典存在key
  10. c语言实验报告评语大全,c语言实验报告(学生).doc
  11. Halcon教程十三:图像预处理
  12. windows ping不通虚拟机ip地址
  13. 【012】Excel宏编程相关封装模块(删除行/列、隐藏列、合并单元格)_005_#VBA
  14. python中的index函数
  15. 使用GatewayWorker框架,多个workerman进程(businessworker)负载不均衡的问题解决过程
  16. 【组合数学】通俗解释 Burnside引理和Polya定理
  17. 标签管理系统Bartender 2022新版前瞻:企业用户随时随地标签打印变得更容易
  18. 最新优客API工具大全源码+调用第三方
  19. pyecharts制作中国地图
  20. 盛世五洲flash进入页 动画设计制作

热门文章

  1. python从入门到入土表情包-Python开发个人专属表情包网站,表情在手,天下我有...
  2. 精通python能干嘛-一个程序员怎样才算精通Python?
  3. python基础语法手册format-Python-输出格式化format()方法的基本使用(2)
  4. 学了python能干啥-第9p,Python是什么?学了Python能干什么?
  5. python基础知识总结-python编程语言基础知识总结
  6. 自学python的书-推荐6本学习Python的免费电子书
  7. python代码示例图形-Python使用matplotlib绘制三维图形示例
  8. 软件测试用python一般用来做什么-如何将Python应用到实际测试工作中?
  9. python中文版编译器下载-python编译器
  10. python测试开发自学教程-【光荣之路】Python全栈测试开发课程