Huffman树

AcWing 148. 合并果子

在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。
达达决定把所有的果子合成一堆。
每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。
可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。
达达在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以达达在合并果子时要尽可能地节省体力。

假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使达达耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。
可以先将1、2堆合并,新堆数目为3,耗费体力为3。
接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。
所以达达总共耗费体力=3+12=15。
可以证明15为最小的体力耗费值。

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

输出格式
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。
输入数据保证这个值小于231

数据范围
1≤n≤10000,
1≤ai≤20000
输入样例:
3
1 2 9
输出样例:
15

Code:
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
具体的实现是先将果子数目按从小到大进行排序,在n个数目中选取两个最小的相加,这时果子种类就变成(n -1)个,再对这(n - 1)按大小进行排序。重复到只剩下一堆。

#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main()
{int n;priority_queue<int, vector<int>, greater<int>> heap;cin >> n;for(int i = 0; i < n; i ++){int x;cin >> x;heap.push(x);}int res = 0;while(heap.size() > 1){int a = heap.top(); heap.pop();int b = heap.top(); heap.pop();res += a + b;heap.push(a + b);}cout << res << endl;return 0;
}

排序不等式

AcWing 913. 排队打水

有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?

输入格式
第一行包含整数 n。
第二行包含 n 个整数,其中第 i 个整数表示第 i 个人装满水桶所花费的时间 ti。

输出格式
输出一个整数,表示最小的等待时间之和。

数据范围
1≤n≤105,
1≤ti≤104
输入样例:
7
3 6 1 4 2 5 7
输出样例:
56

Code:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;typedef long long LL;
const int N = 1e5;
int n, t[N];int main()
{scanf("%d", &n);for(int i = 0; i < n; i ++)  scanf("%d", &t[i]);sort(t, t + n);reverse(t, t + n);LL res = 0;for(int i = 0; i < n; i ++)  res += t[i] * i;printf("%lld\n", res);return 0;
}

贪心:Huffman树(合并果子)、排序不等式(排队打水)相关推荐

  1. 每日四题打卡-4.15:耍杂技的牛/贪心绝对值不等式-货仓选址/贪心排序不等式-排队打水/huffman哈夫曼树-合并果子

    耍杂技的牛 具体:https://blog.csdn.net/qq_27262727/article/details/105515507 农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此 ...

  2. [排序不等式] 排队打水(排序不等式+贪心)

    文章目录 0. 前言 1. 排序不等式+贪心 0. 前言 经典的排序不等式问题,也是一个简单的小学数奥问题. 1. 排序不等式+贪心 913. 排队打水 贪心思路: 让最墨迹的人最后打水,即从小到大排 ...

  3. 贪心——排序不等式——排队打水

    排队打水 总共n人 T=t1*(n-1)+t2*(n-2)+--+tn 按从小到大的顺序排序,等待时间最小 #include <iostream> #include <algorit ...

  4. 贪心(二):排序不等式、绝对值不等式、推公式

    排序不等式 例题:排队打水 有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 titi,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小? 输入格式 第一行包含整数 n ...

  5. 【算法基础26】贪心下——哈夫曼树、排序不等式、绝对值不等式、推公式的思路与应用

    一.合并果子(哈夫曼树) 题目描述:给出n堆不同种类的果子,每堆果子的数量不同,每个果子的重量为1.每次只能合并相邻堆的果子,且花费的体力是果子的重量和.将所有果子合并成一堆,求最小的体力花费. 问题 ...

  6. 1836:【04NOIP提高组】合并果子(三种做法)

    一,贪心 每次只要合并果子数量最小的两堆,再计算耗费的体力值即可. 代码: #include <bits/stdc++.h> using namespace std; int ans,n, ...

  7. ACM - 贪心 - 基础(区间问题 + Huffman树 + 排序不等式 + 绝对值不等式 + 推公式)

    贪心 经典母题 1.区间问题 AcWing 905. 区间选点 AcWing 908. 最大不相交区间数量 AcWing 906. 区间分组 AcWing 907. 区间覆盖 2.Huffman树 A ...

  8. 区间问题,Huffman树,排序不等式,绝对值不等式,推公式

    贪心算法 1区间选点 2哈夫曼树 3排队打水 4货仓选址 5耍杂技的牛 1区间选点 给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点. #includ ...

  9. 贪心:排队打水—排序不等式

    题目: AcWing 913. 排队打水 有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小? 输入格式 第一行包 ...

最新文章

  1. Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略
  2. ateq测漏仪f620中文说明书_Yaman雅萌美容仪详细介绍及2019年韩国免税店最新报价...
  3. java中对象作为参数_java中对象引用,特别作为参数时候注意事项
  4. RTT 使用menuconfig 和cubeMux 在移植过来的模板工程上增加一个串口2
  5. linux ruby作用域,浅谈ruby语言中的一些概念(lambda, proc, block)
  6. 前端优秀框架jQuery weui推荐
  7. SpreadJS使用小结
  8. js获取当前屏幕宽度方法
  9. 后台管理系统——02首页布局
  10. 关于3.3V稳压芯片
  11. Android补间动画原理介绍
  12. 利用bilibili增强脚本下载B站视频+更多强大功能
  13. geojson和topojson数据格式
  14. 牛客网练习—《网络基础》DAY4
  15. 新司机的黑裙战斗机 篇二:入门—新司机的黑群晖指北——软件篇(上)
  16. PMP成本管理中的几个英文缩写
  17. PatriotCTF
  18. 刚安装的谷歌浏览器搜索异常
  19. isbn书号查询易语言代码
  20. 项目38.2 打豆豆

热门文章

  1. 数商云企业采购平台方案丨直联多家供应商,打造一站式采购商城前端
  2. html计数器自动编号,css如何使用计数器给元素自动编号?css计数器的使用(代码示例)...
  3. redis哨兵代码测试异常之:Can connect to sentinel, but myMaster seems to be not monitored...
  4. [转] 良好的设计才能产出精品
  5. thinkphp6验证码不显示解决方案
  6. 美国最极端的经典教育
  7. Android应用设计之实现多线程框架
  8. java 原型链_什么是原型链
  9. extjs发送请求与controller接收请求
  10. 阿里CTO程立:阿里巴巴开源的历程、理念和实践