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

这篇博客探讨了如何利用C++的STL中的优先队列(priority_queue)解决Java合并果子问题,同时介绍了如何构建哈夫曼树进行合并,重点讲解了大顶堆和小顶堆的实现。通过实例代码展示了如何利用priority_queue进行元素比较和自定义类型操作,并提供了多个不同场景下的应用示例,包括ACM竞赛的题目和实际的合并果子问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

priority_queue 对于基本类型的使用方法相对简单。

他的模板声明带有三个参数,priority_queue

Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。

Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.

STL里面默认用的是 vector. 比较方式默认用 operator

所以如果你把后面俩个

参数 缺省的话,优先队列就是大顶堆,队头元素最大。

如果要用到小顶堆,则一般要把模板的三个参数都带进去。

STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆

例子:

67d0865f17d9be527254bf8a8ff6c5b4.gif

1 #include

2 #include

3 #include

4 #include

5 #include

6 #define LL long long

7 using namespace std;

8

9 struct node

10 {

11 int x, y;

12 bool operator < (const node &tmp)const

13 {

14 return x > tmp.x;

15 }

16 };

17 int main()

18 {

19 priority_queueq1; //基本类型从大到小

20 priority_queue, greater >q2; //基本类型从小到大

21 priority_queueq3; //自定义类型

22 return 0;

23 }

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=203#problem/A

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int main()

{

int n,a,sum,sum1;

long long int count;

priority_queue, greater >q;

while(scanf("%d",&n)!=EOF)

{

count=;

for(int i=; i<=n; i++)

{

scanf("%d",&a);

q.push(a);

}

if(n==)

{

printf("%d\n",count);

continue;

}

else

{

while(!q.empty())

{

sum=q.top();

q.pop();

if(q.empty())

{

break;

}

sum1=q.top();

q.pop();

q.push(sum+sum1);

count=count+sum+sum1;

}

printf("%d\n",count);

}

}

return ;

}

#include

#include

#include

#include

#include

#include //队列的头文件

using namespace std;

int a[];

int main()

{

int n,a1,a2,i;

int sum=;

cin>>n;

for(i=;i

{

cin>>a[i];

}

priority_queue , greater >q;//从小到大排列

for(i=;i

{

q.push(a[i]);//进入队列

}

while(q.size()>)//因为最后只剩下一组,所以控制长度大于1

{

a1=q.top();//将a1定义为首元素

q.pop();//出队列

a2=q.top();//将a2定义为首元素

q.pop();//出队列

sum+=a1+a2;

q.push(a1+a2);//这里注意将a1+a2进入队列,而不是sum

}

cout<

return ;

}

&lbrack;tree&rsqb;合并果子(哈夫曼树&plus;优先队列)

现在有n堆果子,第i堆有ai个果子.现在要把这些果子合并成一堆,每次合并的代价是两堆果子的总果子数.求合并所有果子的最小代价. Input 第一行包含一个整数T(T<=50),表示数据组数. 每 ...

AcWing:148&period; 合并果子(哈夫曼树)

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

【CodeForces】700 D&period; Huffman Coding on Segment 哈夫曼树&plus;莫队&plus;分块

[题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

【algo&amp&semi;ds】【吐血整理】4&period;树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...

数据结构之C语言实现哈夫曼树

1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,……,kj, 使得 ki是ki+1 的双亲(1<=i

C&plus;&plus;哈夫曼树编码和译码的实现

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的 ...

数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C&plus;&plus;模板实现

0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

哈夫曼树&lpar;三&rpar;之 Java详解

前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

哈夫曼树&lpar;二&rpar;之 C&plus;&plus;详解

上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...

随机推荐

BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V

异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 一般都是启动一下CUP虚拟化就可以了 比如华硕的:

noi 1&period;5 45&colon;金币

描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里, ...

&lbrack;转&rsqb;Ionic 实现双击返回键退出功能

本文转自:http://ionichina.com/topic/5514b539b6421f9166aa5f88 一.准备 Toast插件 插件地址:cordova plugin add https: ...

Linux 两个目录浅对比拷贝

对比两个目录内容,然后拷贝! #!/usr/bin/python# -*-coding:utf-8 -*-import osimport sysimport shutildef get_dir_con ...

Netsharp FAQ

1.启动服务器时候不能监听端口,出现如下错误: 回答: 这种问题应该是在win7环境下才有,是没有权限,要以管理员身份运行Netsharp.Elephant.Q.exe. 2.启动服务器的时候,服务端 ...

mongodb的常用操作

对于nosql之前工作中有用到bekerlydb,最近开始了解mongodb,先简单写下mongodb的一些常用操作,当是个总结: 1.mongodb使用数据库(database)和集合(collec ...

无法识别的属性&OpenCurlyDoubleQuote;targetFramework”

问题描述:无法识别的属性“targetFramework”.请注意属性名称区分大小写. 解决办法:修改.NET Framework 版本为相应版本即可,例如2.0换成4.0. 参考:http://bl ...

jsp截取字符串

< ...

零基础开始学python

变量规则:在python中变量名不能有特殊字符和数字开头以及python里的一些关键字,可以使用下划线开头,在python里,变量是支持使用中文的,但尽量不要使用中文,为什么?因为这样会让你看起来太l ...

struts2&plus;spring3&plus;hibernate3&plus;mysql简单登录实现

1.导入相关的jar包 2.建立数据库 1 create table account( 2 id int(10), 3 user varchar(50), 4 paw varchar(50) 5 ); ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值