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;
}
京公网安备 11010502036488号