折半查找--hnust oj

题目描述

在一个升序排列的整数数字序列中查找,并返回相应的查找结果。

输入

每个测试用例由多行组成,第一行是两个整数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久长愿长久

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值