问题 M: 序列合并
时间限制: 1 Sec 内存限制: 64 MB
提交: 748 解决: 176
[提交] [状态] [讨论版] [命题人:admin]
题目描述
有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。
输入
第一行一个正整数N;
第二行N个整数Ai,满足Ai<=Ai+1且Ai<=10^9;
第三行N个整数Bi, 满足Bi<=Bi+1且Bi<=10^9.
输出
仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。
样例输入
3
2 6 6
1 4 8
样例输出
3 6 7
提示
对于50%的数据中,满足1<=N<=1000;
对于100%的数据中,满足1<=N<=100000。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;cin>>n;
int a[100005],b[100005],c[100005];
for (int i=0;i<n;i++) cin>>a[i];
for (int i=0;i<n;i++) cin>>b[i];
sort(a,a+n); sort(b,b+n);
int p=0;
memset(c,0,sizeof(c));
for (int k=0;k<n;k++)
{
int x=a[p]+b[c[p]];
int y=p;
for (int i=p+1;i<n;i++)
{
if (a[i]+b[c[i]]<x)
{
x=a[i]+b[c[i]];
y=i;
}
else if (a[i]+b[c[n]]>x){
// cout<<c[n]<<endl;
//cout<<"i="<<i<<endl;
break;
}
}
cout<<x<<" ";
c[y]++;
if (c[p]==n) p++;
}
cout<<endl;
return 0;
}