P1631 序列合并

这道题和后面一道题是孪生兄弟。。。


给你两组单调递增的序列,可以拿里面的元素相互相加,要你求出第1至第\(m\)小的值。

同样是那样的思路,用堆。

\(y = a_i+b_i\),那么就同样有\(n\)个元素了。

这里固定b的下标先不定,向堆里面添加\(a_i+b_1\)

然后执行\(m\)次出队,每次出队补充另一个进来。

顺序输出就可以了,没什么好说的。。。

代码:

#include<cstdio>
#include<queue>

const int maxn = 100005;
struct Nodes
{
    int val, ai, bi;
    bool operator < (const Nodes &rhs) const
    {
        return val > rhs.val;
    }
};
std::priority_queue<Nodes> q;
int a[maxn], b[maxn];
int n;

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
    for(int i = 1; i <= n; i++) q.push((Nodes){a[i] + b[1], i, 1});
    for(int i = 1; i <= n; i++)
    {
        Nodes temp = q.top(); q.pop();
        printf("%d", temp.val);
        q.push((Nodes){a[temp.ai] + b[temp.bi + 1], temp.ai, temp.bi + 1});
        if(i != n) printf(" ");
    }
    printf("\n");
    return 0;
}
posted @ 2018-07-30 23:52  Garen-Wang  阅读(148)  评论(0编辑  收藏  举报