2269: minval
题目描述
有两个长度为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<queue> #include<algorithm> #define N 100005 using namespace std; int main() { priority_queue<int > p; int n,a[N],b[N],ans[N]; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <=n; i++) { cin >> b[i]; } sort(a+1, a + n+1); sort(b+1, b + n+1); for (int j = 1; j <=n; j++) { int tem = a[1] + b[j]; p.push(tem); } for (int i = 2; i <=n;i++) for (int j = 1; j <=n; j++) { int item = a[i] + b[j]; if (item>=p.top()) break; p.pop(); p.push(item); } for (int i = 1; i <=n; i++) { ans[i] = p.top(); p.pop(); } for (int i =n; i>0; i--) { cout << ans[i] << " "; } cout<<endl; return 0; }