问题 B: 序列合并
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有两个长度都为N的序列A和B,在A和B中各取一个数相加可以得到N2个和,求这N2个和中最小的N个。
输入
第一行一个正整数N(1 <= N <= 100000)。
第二行N个整数Ai,满足Ai <= Ai+1且Ai <= 109
第三行N个整数Bi,满足Bi <= Bi+1且Bi <= 109
输出
输出仅有一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
样例输入
3 2 6 6 1 4 8
样例输出
3 6 7
提示
建议用最小堆实现。
#define MAX_SIZE 100005
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
struct Node
{
int b_y;
long val;
friend bool operator<(Node a, Node b)
{
return a.val > b.val;
}
};
Node heap[MAX_SIZE];
long a[MAX_SIZE], b[MAX_SIZE];
int n;
void init()
{
for (int i = 1; i <= n; i++)
{
heap[i].b_y = 0;
heap[i].val = 0;
}
}
priority_queue<Node> q;
void create()
{
Node temp;
for (int i = 1; i <= n; i++)
{
temp.b_y = 1;
temp.val = a[i]+b[1];
q.push(temp);
}
}
void make(){
Node top,temp;
int len = 1;
while(len <= n ){
top = q.top();
q.pop();
if(top.b_y<n){
temp.b_y = top.b_y+1;
temp.val = top.val-b[top.b_y]+b[top.b_y+1];
q.push(temp);
}
len++;
cout<<top.val<<" ";
}
cout<<endl;
}
int main()
{
int i;
while (cin >> n)
{
fill(a, a + n, 0);
fill(b, b + n, 0);
for (i = 1; i <= n; i++)
cin >> a[i];
for (i = 1; i <= n; i++)
cin >> b[i];
create();
make();
}
return 0;
}
/**************************************************************
Problem: 3555
User: morizunzhu
Language: C++
Result: 正确
Time:264 ms
Memory:8304 kb
****************************************************************/