题目描述
在一个升序排列的整数数字序列中查找,并返回相应的查找结果。
输入
每个测试用例由多行组成,第一行是两个整数n和m,其中,1<=n,m<=1000000。
自第二行起一共有n+m个整数,其中前面n个整数代表升序排列的有序序列,随后的m个整数是待查询的数。n+m个整数的取值在范围1到10^12(10的12次方)之间。
输出
对于每个待查询的数,如果在有序序列中则输出"yes",否则输出"no",每行输出一个查询结果。
样例输入
5 3
6 23 45 56 586
33 66 6
样例输出
no
no
yes
提示
1、本题的数据超过了int的表示范围,要用64位数据。
1)在VC6中调试,变量定义用__int64类型,输入输出格式用%I64d。(__int64前是2条下划线,%I64d中的I是字母i的大写)
2)在windows版的Codeblocks中调试,变量定义用__int64类型或long long,输入输出格式用%I64d
3)在linux环境下的Codeblocks中调试或在OJ上提交时,变量定义只能用long long类型,输入输出格式用%lld
2、数组占内存超过1M,请开全局数组
代码实现
此代码可以通过oj 的测试,不过对于题目要求来说耗时比较长,有待优化
#include <iostream>
using namespace std;
typedef long long InfoType;
//#define long long a[10];
int search_bin (InfoType a[],long long n,long long key)
{
long long low,high;
low=1;high=n;
while(low<=high)
{
long long mid=(low+high)/2;
if(key==a[mid])
{
cout << "yes" << endl ;
return 0;
}
else if (key<a[mid]) high=mid-1;
else low=mid+1;
}
cout << "no" << endl ;
return 0;
}
int main(){
long long n,m;
// InfoType a[1000];
cin >> n >> m;
long long key, a[n],b[m];
for (int i=1; i<=n; i++)
{
cin >> a[i];
}
for( int i=0;i<m;i++)
{
cin >> key;
b[i]=key;
}
for( int i=0;i<m;i++)
{
key=b[i];
search_bin(a,n,key);
}
return 0;
}//main