2622: 小H的集合

2622: 小H的集合

题目描述

小Q发现小P和小H各有一个集合,但是小P的集合A和小H的集合B不一样,小P的集合A里有n个整数且无序,小H的集合B里有m个整数且有序,小Q有一个整数k,小Q想在集合A与集合B中找到一个整数使他们相加正好等于k。你能帮助小Q吗?

输入

第一行是三个整数n,m,k,分别表示集合A的大小、集合B的大小、k的值。(0<n<=100000,0<m<=100000,k在int范围内)

第二行是n个整数。代表小P的集合A中的数,每个数唯一(int范围内)
第三行是m个整数。代表小H的集合B中的数,每个数唯一(int范围内)

输出

请输出一行包含两个整数,分别表示集合A中的数与集合B中的数,整数之间有空格。(输入数据保证输出结果唯一)

样例输入
Copy

5 4 34
1 2 3 4 7
10 20 30 40

样例输出 Copy
4 30

这道题的题目给出集合A是无序的,集合B是有序的,使用两个嵌套的for循环时间会超限,使用二分法能使时间复杂度降低。

扫描二维码关注公众号,回复: 11525049 查看本文章
#include<stdio.h>
//二分法
int fun(int a[],int n,int k)
{
    int low=0,high=n-1,mid;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(a[mid]==k)     return mid;
        else if(a[mid]<k) low=mid+1;
        else high=mid-1;
    }
    return -1;
}
//主函数
int main()
{
    int n,m,k,h;
    scanf("%d %d %d",&n,&m,&k);
    int a[n],b[m];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d",&b[i]);
    }
    for(int i=0;i<n;i++)
    {
        h=fun(b,m,k-a[i]);
        if(h!=-1)
        {
            printf("%d %d\n",a[i],b[h]);
            break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44500344/article/details/104727470