2269: minval(优先队列 堆排序)

2269: minval

时间限制: 3 Sec  内存限制: 256 MB
提交: 638  解决: 65
[提交][状态][讨论版][命题人:外部导入]

题目描述

有两个长度为N的序列A和B,在A和B中各任取一个数相加可以得到N2个和,求这N2个和中最小的N个。

输入

第一行输入一个正整数N(1<=N<=100000);

第二行N个整数Ai且Ai<=109;第三行N个整数Bi且Bi<=109

输出

输出仅一行,包含n个整数,从小到大输出这n个最小的和,相邻数字之间用空格隔开。

样例输入

5
1 3 2 4 5
6 3 4 1 7

样例输出

2 3 4 4 5
/* 堆排序(优先队列)
*  维护 n 个最小的数字
*  别忘记排序
*/

#include<queue>
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std ; 

#define maxn 110000
int n ;
int num1[maxn] , num2[maxn] ; 

priority_queue<int> min_num ;
int result[maxn] ; 

int main(){
    cin>>n ; 

    for(int i=1 ; i<=n ; i++){
        scanf("%d" , &num1[i]) ;
    }
    for(int j=1 ; j<=n ; j++){
        scanf("%d" , &num2[j]) ;
    }
    sort(num1+1 , num1+n+1) ;
    sort(num2+1 , num2+1+n) ; 

    for(int i=1 ; i<=n ; i++){
        min_num.push(num1[1] + num2[i]) ;
    }
    for(int i=2 ; i<=n ; i++){
        for(int j=1 ; j<=n ; j++){
            if(num1[i] + num2[j] < min_num.top()){
                min_num.pop() ;
                min_num.push(num1[i] + num2[j]) ;
            }else {
                break ;
            }
        }
    }

    for(int i=1 ; i<=n ; i++){
        result[i] = min_num.top() ;
        min_num.pop() ;
    }

    for(int i=n ; i>=1 ; i--){
        printf("%d " , result[i]) ;
    }

    return 0 ;
}

原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/8904151.html

时间: 2024-10-12 11:52:11

2269: minval(优先队列 堆排序)的相关文章

数据结构--优先队列(堆排序)

数据结构--优先队列(堆排序) 优先队列:不是先进先出啦,下面的代码是大顶堆,大的先出. 在之前理解堆排序的基础上,在来理解优先队列. 还是用这个公式: leftNo = parentNo*2+1 rightNo = parentNo*2+2 parentNo = (nodeNo-1)/2 每次进队列是从最后进,在慢慢上浮. 每次出队列,堆顶先出,在把队尾调到堆顶,在下浮. 上代码 package sy181002; import java.util.Arrays; /** * 优先队列 * *

常见算法动画

这里是地址    http://de.visualgo.net/ 7    VisuAlgo   开始训练!   这是中文的网站 http://visualgo.net. 请参阅本文更多详情. en zh ru id bn ja de ko vi th nl .VisuAlgo.net 数据结构和算法动态可视化 (Chinese) 排序 冒泡选择插入归并快速随机快速选择插入计数基数排序cs2020cs1020cs1010cs3230数组链表数据结构算法排序 位运算 位操作布尔值数组小型集合cs3

利用堆实现堆排序&amp;优先队列

数据结构之(二叉)堆 一文末尾提到"利用堆可以实现:堆排序.优先队列".本文代码实现之. 1.堆排序 假设要将无序数组按非递减(递增)排序,则应使用大(小)顶堆.这里涉及到大堆排序涉及到三种操作:(1).MaxHeapify操作(自顶向下即SiftDown操作):(2).BuildMaxHeap操作(线性时间内将无序数组构造成一个最大堆):(3)将堆顶元素和堆的最后一个元素交换,并将堆元素大小减去1,对堆顶元素调用MaxHeapify操作重新调整为大顶堆,重复直到数组有序.下面是详细的

算法导论学习之堆+堆排序+堆构成优先队列

注:堆分为最大堆和最小堆两种,下面我们讨论的堆都是指的最大堆,最小堆的性质与其是类似的. 堆数据结构是一种数组对象,可以被视为一棵完全二叉树(这棵二叉树除最后一层外,其余每层都是填满的):我们用一个数组来存储一个堆,表示堆的数组有两个属性:length[A]表示的是数组中的元素个数,headsize[A]表示堆中元素个数(也就是说数组中的元素不一定都是堆中的元素). 下面不加证明的给出一些堆的性质: 对于任何一个节点,其父节点为i/2(i>1):左儿子:2*i,右儿子:2*i+1; 对于最大堆每

堆排序与优先队列&mdash;&mdash;算法导论(7)

1. 预备知识 (1) 基本概念     如图,(二叉)堆一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组A包括两个属性:A.length给出了数组的长度:A.heap-size表示有多少个堆元素保存在该数组中(因为A中可能只有部分位置存放的是堆的有效元素).     由于堆的这种特殊的结构,我们可以很容易根据一个结点的下标i计算出它的父节点.左孩子.右孩子的下标.计算公式如下: parent(i) =

第六章 堆排序 6.5 优先队列

package chap06_Heap_Sort; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; import org.junit.Test; /** * 优先队列,二叉堆数组实现,数组的size最好大一些,至少比里面的堆大一些,来实现堆的扩展(插入元素) * * @author xiaojintao * */ public class PriorityQueue {

堆与堆排序—优先队列

上一节我们写了树以及二叉树的知识 http://blog.csdn.net/wtyvhreal/article/details/43487095 堆是一种特殊的完全二叉树. 所有父节点都比子节点要小,这样的完全二叉树称为最小堆,反之叫最大堆. 下图一棵完全二叉树,调整为最小堆步骤: 向下调整的代码如下: 从上面可以得到:调整堆的时间复杂度是O(logN). 如果堆的大小为N,那么插入一个新元素所需要的时间为O(logN). 在刚刚那个最小堆里插入数值3 向上调整的代码如下: 建堆:从空的堆开始,

算法2.4——优先队列与堆排序

优先队列(Priority Queues)的使用和队列(删除最老的元素)以及栈(删除最新的元素)类似.举个实用例子:也就是从10亿个元素中选出最大的10个,有了优先队列,就只需要用一个能存储10个元素的队列即可. 而二叉堆很好实现优先队列的基本操作.其中二叉堆是一组能够用队友徐的完全二叉树排序的元素.其中关于堆的算法,有上浮swim和下沉sink,另外一般来说A[0]不使用,直接使用A[1]. 堆排序的实现 实现堆排序需要解决两个问题: 1.如何由一个无序序列建成一个堆? 2.如何在输出堆顶元素

堆数据结构+堆排序+最大优先队列的堆的实现

对于堆排序,首先要先知道什么是堆数据结构,堆数据结构就是一个完全二叉树,但是它有自己的性质. 例如最大堆的性质为:A[PARENT[i]]>=A[i]:即每一个结点的值大于等于其左右孩子的值,小于等于其父节点的值.我们在这里只讨论最大堆的情况.我们知道一颗完全二叉树对应一个最大堆的形式,我们要做的就是将二叉树转化为最大堆,这就是所谓的最大堆的维护,我们定义函数MaxheapFY(A,i)来进行操作. 代码: /** *MaxheapFY(A,i):维护位置i最大堆性质,此时假设left(i)和r