问题 B: 序列合并

问题 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
****************************************************************/

猜你喜欢

转载自blog.csdn.net/Morizunzhu/article/details/81462812