• 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 ; 
    }
  • 相关阅读:
    gnuplot
    charles证书安装
    jenkins 配置ssh
    jenkins 配置slave
    centos 安装jenkins
    mac的一些命令
    docker 常用命令
    GO vim环境
    go vendor目录
    protobuf
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/8904151.html
Copyright © 2020-2023  润新知