【数据结构•堆】序列和的前n小元素(堆排序)

《数据结构初阶》二叉树之堆的实现和堆排序 本章重点介绍堆概念、堆的相关接口、堆排序(含有动态图) 阅读详情

题目描述

问题:序列和的前nnn小元素
给出两个长度为nnn的有序表AAA和BBB, 在A和B中各任取一个, 可以得到 n2n^2n2 个和. 求这些和最小的nnn个。

输入输出格式

输入格式:

输入数据共三行。
  第一行,一个整数值nnn ( nnn <= 10410^4104 )。
  第二,第三行,各有nnn个从小到大排好序的整数,每个整数间有一个空格间隔。(每个整数均小于2^30)

输出格式:

输出数据一行,这些和最小的nnn个数,从小到大输出,每个整数之间一个空格间隔。

输入输出样例

输入样例#1:

3
2 6 6
1 4 8

输出样例#1:

3 6 7

思路

我刚看到这题的时候还以为是到水题,不就是给n2n^2n2个数排个序然后输出吗?结果花两分钟写完代码然后直接TLE…
然后听了一下老师的评讲,发现确实是一道水题
思路大概就是:
1.建一个大根堆(优先队列)来维护a数组和b数组的和
!!!是大根堆不是小根堆!!!不要看它是从小到大排序就建小根堆因为大根堆的堆顶是最大的,相当于一个守门员,所有数想要进堆就必须经过它。我们可以借助这个堆顶来筛选所有数字。
2.双重循环暴力枚举a数组和b数组的和,但!!!这里可以剪枝!!!由于输入的是两个有序表,所以只要有一个加出来的和比大根堆的堆顶大,那么后面加出来的和会比大根堆的堆顶更大,是不可能入得了堆的。所以直接break就行啦
3.将比堆顶小的a数组和b数组的和放入堆中
4.这时我们可以得到一个从大到小的队列(大顶堆),最后倒过来输出一下就AC啦

如果没看懂就看看代码和注释吧:

AC代码

#include<bits/stdc++.h>
using namespace std;
int n,t,a[100001],ans,b[100001],c[100001];
map<int,int> p;
priority_queue <int,vector<int>,less<int> > q;//从大到小 
//priority_queue <int,vector<int>,greater<int> > q1;//从小到大 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){//输入 
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){//先将a[1]+b[1...n]放入队列 
		cin>>b[i];
		q.push(a[1]+b[i]);
	}
	for(int i=2;i<=n;i++){//枚举 
		for(int j=1;j<=n;j++){
			if(a[i]+b[j]>q.top()) break;
			//由于b是一个有序表,所以如果当前这个都大了那么后面的会更大 ,所以可以直接break 
			q.pop();//弹出最大的 
			q.push(a[i]+b[j]);//放入新的数 
		}
	}
	//这时得到了一个大顶堆,我不知道怎样倒过来,所以用了最笨的方法,如果有更好的方法欢迎评论区讨论哦
	int i=0;
	while(!q.empty()){//倒过来
		i++;
		c[i]=q.top();
		q.pop();
	}
	for(int j=i;j>=1;j--) cout<<c[j]<<" ";//输出
	return 0;
}

这题这样就过啦,记得三连支持一下哦QAQ

数据结构:堆 数据结构:模拟堆与堆排序 阅读详情

相关推荐

【数据结构】选择排序—堆排序

​堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 ​

四季轮换叶,一路招摇胜 2259

【数据结构与算法实验】最小堆实现找m个数中最小的n个数

使用数组存储所输入的数据,使用堆结构的下渗算法将数组建成最小堆,然后输出。因为建堆的时间为O(n),所以在处理类似找最小或最大数据的应用场景中,使用堆这一工具,可以提高程序效率。当然,实验中应用的方法并不是堆排序的最好方法,仅供参考。

GeekKid的博客 393

序列和的前n小元素

实现了高级数据结构里面的习题序列和前n小元素

算法----序列和的 top N

Description: 两个长度为 n 的数组 A 和 B, 各从中选出一个元素相加 A[i] + B[j], 求 top n 小的那些和。 http://www.cnblogs.com/372465774y/archive/2012/07/09/2583866.html

L.J.SHOU的专栏 3053

MATLAB 论文复现——面向紧急需求响应的规模化灵活资源负荷管理快速决策方法

其次,对灵活资源参与EDR的功率分配模型进行了建模,并提出了基于分层分布式共识算法的快速决策方法,对功率分配模型进行快速求解,以满足EDR实时性的需求,在保证较高精度的前提下提高了决策速度。[1]孔祥玉,杨至端,孙裕策,等.面向紧急需求响应的规模化灵活资源负荷管理快速决策方法[J/OL].电力系统自动化,1-13[2024-07-29].http://kns.cnki.net/kcms/detail/32.1180.TP.20240709.1843.002.html.关键词: 规模化灵活资源;

sjr1478的博客 374

Apollo control模块横向控制原理及核心代码逐行解析

看完这篇文章,你会对apollo横向控制有一个整体的概念

weixin_39199083的博客 2万+

【数据结构•堆】序列和的前n小元素

给出两个长度为n的有序表A和B, 在A和B中各任取一个, 可以得到 n^2 个和. 求这些和最小的n个。第二,第三行,各有n个从小到大排好序的整数,每个整数间有一个空格间隔。输出数据一行,这些和最小的n个数,从小到大输出,每个整数之间一个空格间隔。故,在第二层循环时,若已有n个数,则只需判断一次即可退出循环。第一行,一个整数值n ( n <= 10^4 )。100%数据,n <= 10^4。30%数据,n <= 10^2。50%数据,n <= 10^3。暴力枚举每个数,使堆内始终有n个数。

cgj0128_1的博客 511

R语言:基于Spatstat包的单变量和双变量平面Ripley‘s K函数分析

因为网上查找得到的R语言K函数分析的资料很少,Spatstat包的介绍也很少,所以抛砖引玉。本文简单介绍了使用R语言spatstat包的Kest,Kcross(Lcross)和Kinhom方法进行了单变量和双变量平面Ripley's K函数分析的方法及代码,希望有所帮助。

hsdcmax的博客 1万+

Python求列表元素的最大,最小值,总和,均值,中位数及方差

一 求解问题: 不使用其他库的情况下,自定义一个函数,求给定数字列表的最大值,最小值,均值,中位数及方差 二 所使用的数学公式: 三 问题分析 1.获取列表元素的最大最小值:可以对先对列表使用sort()方法排序,第一个及最后一个元素即是最大最小值。 2.求列表元素的总和:使用for循环遍历列表,将其中的元素依次相加求和即可 3.求列表元素的均值:使用len()得出列表元素的个数,然后将得出的总和/元素个数即可 4.求列表元素的中位数:因为列表元素已经排过序,则:先判断列表元素个数%2是否

这里是努力做好AC吧 2万+

element的el-cascader组件动态加载,以及报错处理问题

Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. 报错处理

weixin_56527169的博客 1264

[QT笔记]QTableView与QTableWidget表头设置实战对比

本文深入对比了QT开发中QTableView与QTableWidget在表头设置上的核心差异与实践方法。QTableWidget提供开箱即用的便捷API,适合快速开发;而QTableView遵循模型-视图架构,表头数据由模型管理,虽设置稍复杂但灵活性与扩展性更强。文章通过实战代码示例,详细解析了两种组件的适用场景、性能考量及常见避坑指南,帮助开发者根据项目需求做出高效选择。

weixin_29018335的博客 322

三种方法计算列表中的元素之和

#使用for i in range total = 0 list = [10, 20, 8, 20, 30, 50] for i in range(0, len(list)): total += list[i] print(‘列表中的元素之和是:’, total) #使用while循环 total = 0 ele = 0 list1 = [11, 5, 17, 18, 23] while (ele < len(list1)): total = total + list1[ele] ele += 1 p

qq_58774618的博客 1万+

perftest实战:从零到一,精准评估RDMA网络性能

想象一下,两台服务器传输数据就像在同一个主板上交换内存,这种零拷贝、低延迟的特性,正是高性能计算、分布式存储等场景梦寐以求的。对于云环境用户,主流云厂商现在都提供RDMA实例(比如AWS的EFA、阿里云的eRDMA)。但要注意,不同机型支持的RDMA协议版本可能不同,这会直接影响测试结果的上限值。记得记录每次测试的BW average值,绘制成曲线图后,你可能会发现类似"阶梯状"的性能变化,这通常与网卡的DMA引擎设计有关。在云环境中,由于虚拟化层的影响,延迟会比裸金属高20-30%。

weixin_28700411的博客 215

数据结构和算法 堆排序 (图解堆调整)

什么是堆? 堆:是一种特殊的序列 并且 将该序列想象为 完全二叉树 元素满足: (ki <= k2i && ki <= k2i+1) 每个结点一定比它的左右孩子小 (孙子不一定) 这种堆称为 最小化堆(小堆) (树根是最小的) (ki >= k2i && ki >= k2i+1) 每个点一定比它的左右孩子大 (孙子不一定)这种堆称为 最大化堆(大堆) (树根是最大的) 堆排序(以最大化堆为例) 堆调整:排序之前需要将序列调整为 堆 (

Kiddyup的博客 9467

【RH850/U2A】:HSM与APP通信(中断方式)

HSM与APP通信(中断方式)

1994

069、PCIE属性字段:缓存、顺序与安全

上个月调试一块自研的PCIE采集卡,遇到了一个诡异的问题:主机通过DMA从设备读取图像数据,大部分帧正常,但偶尔会出现局部数据错位,像是缓存没刷干净。用逻辑分析仪抓链路层报文,发现TLP(事务层包)本身完好,但内存中的数据就是不对。排查三天后,终于锁定在设备端TLP的**属性字段(Attribute Field)**配置上——那几位看似不起眼的缓存、顺序控制位,差点让项目延期。今天我们就拆解PCIE事务头中的这个关键区域,看看它如何影响系统性能与数据安全。

z534437748的博客 50

【数据结构与算法】“堆”还能这样用_堆的应用

💛 前情提要💛本章节是的的相关知识~接下来我们即将进入一个全新的空间,对代码有一个全新的视角~以下的内容一定会让你对有一个颠覆性的认识哦!!!❗以下内容以的方式实现,对于来说最重要的是哦❗以下内容干货满满,跟上步伐吧~作者介绍:堆排序Top-K问题💡堆排序:本质为选择排序的一种堆排序便是利用这种数据结构的思想进行排序✊如果有同学不太熟悉,可点击⌈跳转⌋补充知识再出发呀🔥 思想:❓思考: 如何利用进行排序 假如排,我们利用进行排序的话:我们建好一个小堆后,因为小堆的特性为的数在根节点处(最上面),我们....

Dream_Y.ocean的博客 1197

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数据结构之堆排序算法详解+C语言实现

堆   堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 堆排序   堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 在数据结构中,我们将堆的逻辑结构映射到数组中存储,如下图: 于是在数组中,堆中节点的索...

我的程序猿学习之路 6028

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

堆排序中每次堆调整后的次序

堆排序中每次堆调整后的次序 未经允许,不得转载! 引言 堆排序是对简单选择排序的一种改进,改进的着眼点是如何减少选择的比较次数。在特定的条件下,堆排序的效率是明显优于快速排序的。那么,堆排序是如何减少记录的比较次数,提高整个排序的效率的? 需求分析 问题描述 堆排序(heap sort)是对简单选择排序的一种改进,改进的着眼点是:如何减少记录的比较次数。简单选择排序在一趟排序中仅选出最小记录,没有...

qq_44282456的博客 5535

堆的应用1——堆排序

由于非叶子结点的索引是(n - 1) / 2(向下取整),这里(n - 1 - 1) / 2是为了得到正确的最后一个非叶子结点的索引。每个结点的向下调整时间复杂度为O(logN),但由于每个结点只调整一次,所以整个建堆过程的时间复杂度为O(N)。这里您选择使用向下调整的方法来建堆,这是一个高效的方法,因为向下调整每个非叶子结点只需要O(logN)的时间,并且整个建堆过程的时间复杂度为O(N)。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父结点。

2301_80224556的博客 1597

数据结构与算法之堆

1.1.堆的定义 堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。 堆的特性: 1.它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。 2. 它通常用数组来实现。 具体方法就是将二叉树的结点按照层级顺序放入数组中,根结点在位置1,它的子结点在位置2和3,而子结点的子结点则分别在位置4,5,6和7,以此类推。 如果一个结点的位置为k,则它的父结点的位置为[k/2],而它的两个子结点的位置则分别

白大锅的博客,毕设WangLoveBai_999 1万+

堆 与 堆排序

堆概念与性质、堆的调整、向下调整、堆的插入(向上调整)、堆的创建、堆的删除、堆排序、代码实现、TOP-K问题、优先级队列 priority_queue

知识分享与学习笔记总结,欢迎指点 685

【初探数据结构】堆的应用实例(堆排序与TopK问题)

应用场景核心思路时间复杂度空间复杂度优势堆排序构建堆 + 交换堆顶O(n log n)O(1)原地排序,适合内存敏感TopK问题维护大小为K的最小堆O(n log K)O(K)高效处理海量数据或数据流堆结构凭借其高效的插入删除和极致的空间利用率,在排序与筛选问题中占据独特地位。掌握堆排序与TopK的解法,能显著提升处理大规模数据的能力。理解原理后,可尝试手写堆实现或结合具体业务场景优化代码,进一步巩固知识。

Surplus886的博客 1369

什么是堆以及堆排序原理

1.什么是堆? 答:堆是一种特殊的完全二叉树 问:什么是完全二叉树? 答:完全二叉树是二叉树的一种 问:什么是二叉树? 答:二叉树是树的一种 问:什么是树? 答:enmmmm,下面让我们来简单从头捋一遍,最后就知道什么是堆,以及堆排序是如何实现的了 树:树是不包含回路的连通无向图(任意的两个节点仅有唯一的一条路径连通,在一棵树中加一条边会构成图) 二叉树:是一种特殊的树,只要不为...

MaxineZhou的博客 3626

玩转python:通俗易懂掌握Python数据结构之堆

堆是Python中一种高效且灵活的数据结构,适用于优先队列、排序、最短路径等场景。通过本文的案例,希望可以帮助大家实际应用中得心应手!

Luckstar2019的博客 1346

堆与堆排序

这里的堆,不是内存管理中说的堆栈的堆,前者的堆,准确的说是二叉堆,是一种类似于完全二叉树的数据结构;后者的堆是一种类似于链表的数据结构。

weixin_45787009的博客 1411
上一篇: 让ChatGPT介绍一下ChatGPT(ChatGPT的自我介绍)
下一篇: 关于人工智能的高新项目与技术
GG_Bond...
博客等级 码龄5年 531粉丝 64原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值