UPC 问题 M: 序列合并

问题 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;
}

猜你喜欢

转载自blog.csdn.net/a17865569022/article/details/81568589
UPC