题目描述
从前,有一对感情破裂的兄弟。为了拯救他们之间的感情,兄弟两人每个人都准备了一些对于他们来说可以拯救他们之间感情的数字,这些数字可以拯救他们的感情吗?(若在两个列表中的分别存在一个数,它们的和为10000,则我们认为这些数字可以拯救他们之间的感情)。你的程序应该决定,是否有可能从两个整数列表选择这样两个数字,来拯救他们的感情。
输入
每堆数(共2堆)的输入格式如下:每堆数的第一行,包含一个整数N ( 1 <= N <= 50,000 ),表示当前列表中的数字的个数;接下来N行,每一行包含一个整数A ( -32767<= A <=32767 )。输入数据保证:第一堆数按照升序排列,第二堆数按照降序排列。
输出
如果能找到符合要求的两个数,就输出"YES",否则输出"NO"
样例数据
样例输入
4
-175
19
19
10424
3
8951
-424
-788
样例输出
YES
解析
由于两个数列都有序(连sort都不用),直接对一个列表进行枚举,对另一个列表进行二分查找就行了。
#include<cstdio>
using namespace std;
int A[50000],B[50000];
int main()
{
int n1,n2,mid,Max,Min;
scanf("%d",&n1);
for(int i=0;i<n1;i++)
scanf("%d",&A[i]);
scanf("%d",&n2);
for(int i=0;i<n2;i++)
scanf("%d",&B[i]);
for(int i=0;i<n1;i++)
for(Min=0,Max=n2-1,mid=(Max+Min)/2;Min<=Max;mid=(Max+Min)/2)
{
if(A[i]+B[mid]==10000)
{
printf("YES");
return 0;
}
else if(A[i]+B[mid]>10000)
Min=mid+1;
else
Max=mid-1;
}
printf("NO");
return 0;
}
|