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