问题 L: minval
时间限制: 3 Sec 内存限制: 256 MB提交: 619 解决: 61
[ 提交][ 状态][ 讨论版][命题人: 外部导入]
题目描述
有两个长度为N的序列A和B,在A和B中各任取一个数相加可以得到N2个和,求这N2个和中最小的N个。
输入
第一行输入一个正整数N(1<=N<=100000);
第二行N个整数Ai且Ai<=109;第三行N个整数Bi且Bi<=109。
输出
输出仅一行,包含n个整数,从小到大输出这n个最小的和,相邻数字之间用空格隔开。
样例输入
5
1 3 2 4 5
6 3 4 1 7
样例输出
2 3 4 4 5
思路:优先队列
代码:
#include<bits/stdc++.h>
using namespace std;
struct Item
{
int s,b;
Item(int s,int b):s(s),b(b) {}
bool operator<(const Item& rhs) const
{
return s>rhs.s;
}
};
void merge(int *A,int *B,int *C,int n)
{
priority_queue<Item> q;
for(int i=0; i<n; i++) q.push(Item(A[i]+B[0],0));
for(int i=0; i<n; i++)
{
Item item=q.top();
q.pop();
C[i]=item.s;
int b=item.b;
if(b+1<n) q.push(Item(item.s-B[b]+B[b+1],b+1));
}
}
int A[2][100010];
int main()
{
int n;
cin >>n;
for(int i=0; i<2; i++)
{
for(int j=0; j<n; j++) scanf("%d",&A[i][j]);
sort(A[i],A[i]+n);
}
merge(A[0],A[1],A[0],n);
printf("%d",A[0][0]);
for(int i=1; i<n; i++) printf(" %d",A[0][i]);
printf("\n");
return 0;
}