序列合并
题目
输入
输出
输入样例
3
2 6 6
1 4 8
输出样例
3 6 7
解题思路
这题用的是二叉堆,我们先固定一边从小到大,然后先选小的再选大的
然后就让每一个数与另一边的第一个进行对应,然后丢进堆里
只要你在堆里每次弹出最小的数即可
程序如下
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
int n, a[100001], b[100001], now[100001];
priority_queue <pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > q;
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)
{
now[i] = 1;
q.push(make_pair(a[i] + b[1], i));
}
for(int i = 1; i <= n; ++i)
{
printf("%d ",q.top().first);
int t = q.top().second;
q.pop();
now[t]++;
if(now[t] > n) continue;
q.push(make_pair(a[t] + b[now[t]], t));
}
return 0;
}