2269: minval(优先队列 堆排序)
Posted 0一叶0知秋0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ; }
以上是关于2269: minval(优先队列 堆排序)的主要内容,如果未能解决你的问题,请参考以下文章