B[0]+A[0] <= B[0]+A[1] <= … <= B[0]+A[N-1]
B[1]+A[0] <= B[1]+A[1] <= … <= B[1]+A[N-1]
……
B[N-1]+A[0] <= B[N-1]+A[1] <= … <= B[N-1]+A[N-1]
显然,在同一列中,每一行都比上面一行的值要大.
因为两个数组都是有序递增,所以先建立堆结构(大顶堆)
将其中一个数组A的第一个元素与另一个数组B的所有元素相加的结果依次放入
然后再从A的第二个元素开始,依次与B中所有元素相加,相加结果与堆中根结点比较
a.如果比堆的根结点小,删除根结点,将此结果加入堆
b.如果比根结点大,那么跳出此次循环,访问A的下一个元素。
最后将大顶堆的数据倒序输出(借助栈进行)

#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

typedef long long ll;
int n;
vector<ll> A, B;
priority_queue<ll> q;

//数组输入函数
void input(vector<ll> &arr, int mode)
{
    ll x;
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &x);
        arr.push_back(x);
        if (mode)
            q.push(B[i] + A[0]);
    }
}
// 堆输出函数
void output(priority_queue<ll> q)
{
    stack<ll> st;
    while (!q.empty())
    {
        st.push(q.top());
        q.pop();
    }
    while (!st.empty())
    {
        printf("%d", st.top());
        st.pop();
        !st.size() ? printf("\n") : printf(" ");
    }
}
int main()
{
    while (~scanf("%d", &n))
    {
        input(A, 0);
        input(B, 1);
        for (int i = 1; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                if (A[i] + B[j] < q.top())
                {
                    q.pop();
                    q.push(A[i] + B[j]);
                }
                else
                    break;
            }
        }
        output(q);
    }
    return 0;
}