minval_优先队列排序
2269:
时间限制: 3 Sec 内存限制: 256 MB提交: 839 解决: 151
[提交][状态][讨论版][命题人:外部导入]
题目描述
有两个长度为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
来源
#include <iostream> #include <algorithm> #include <queue> #include <vector> using namespace std; priority_queue<int> Q; // 大的先出队 priority_queue<int, vector<int>, greater<int>> Q2; // 小的先出队 #define maxn 100000 int n, m; int num1[maxn], num2[maxn]; int main() { while (cin >> n ) { for (int i = 0; i < n; i++) { cin >> num1[i]; } for (int i = 0; i < n; i++) { cin >> num2[i]; } sort(num1, num1 + n); sort(num2, num2 + n); for (int i = 0; i < n; i++) { // 初始化加入 n 个元素 Q.push(num1[i] + num2[0]); } int temp; int q; for (int i = 0; i < n; i++){ for (int j = 1; j < n; j++) { // 不能重复包含之前加过的元素 temp = num1[i] + num2[j] ; q = Q.top(); Q.pop(); if (q <= temp) { Q.push(q); break; } else { Q.push(temp); } } } for (int i = 0; i < n; i++) { q = Q.top(); Q.pop(); num1[i] = q; } for (int i = n - 1; i >= 0; i--) { cout << num1[i]; if (i != 0) { cout << " "; } } cout << endl; } return 0; }