给出两个包含 nn 个整数的数组 AA,BB。分别在 AA, BB 中任意出一个数并且相加,可以得到 n^2n2个和。求这些和中最小的 nn 个。
输入格式
输入第一行一个整数 n(1 \le n \le 50000)n(1≤n≤50000)。
接下来一行输入数组 AA,用空格隔开。
接下来一行输入数组 BB,用空格隔开。
1 \le A_i, B_i \le 10^91≤Ai,Bi≤109
输出格式
从小到大输出最小的 nn 个和,用空格隔开。
样例输入
4 1 3 5 7 2 4 6 8
样例输出
3 5 5 7
#include<iostream>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
const int mmax=50010;
int A[mmax],B[mmax];
struct Item
{
int s,b;
Item(int s,int b):s(s),b(b){}
bool operator < (const Item &b) const
{
return s>b.s;
}
}
priority_queue<Item> q;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>A[i];
}
for(int i=0;i<n;i++)
{
cin>>B[i];
}
sort(A,A+n);
sort(B,B+n);
for(int i=0;i<n;i++)
{
q.push(Item(A[i]+B[0],0));
}
for(int i=0;i<n;i++)
{
Item item=q.top();
q.pop();
cout<<item.s;
if(i!=n-1)
cout<<" ";
int b=item.b;
if(b+1<n)
q.push(Item(item.s-B[b]+B[b+1],b+1));
}
return 0;
}