NOJ 1001 二分查找

来源:互联网 发布:网络尖兵破解软件 编辑:程序博客网 时间:2024/06/05 09:52

2016.10.28

【题目描述】
1001.二分查找

时限:1000ms 内存限制:10000K 总时限:3000ms

描述
给定一个单调递增的整数序列,问某个整数是否在序列中。

输入
第一行为一个整数n,表示序列中整数的个数;第二行为n(n不超过10000)个整数;第三行为一个整数m(m不超过50000),表示查询的个数;接下来m行每行一个整数k。
输出
每个查询的输出占一行,如果k在序列中,输出Yes,否则输出No。

输入样例
5
1 3 4 7 11
3
3
6
9
输出样例
Yes
No
No

【解题思路】
二分查找,条件是序列必须有序,然后设置左右边界,每次比较中间值与目标值的大小,以确定左右边界。时间复杂度O(logn)

【代码实现】

#include <stdio.h>void binary_search(int [], int ,int );int main(void){    int i, n, m, key;    int a[10005];    scanf("%d", &n);    for (i = 1; i <= n; ++i)        scanf("%d", &a[i]);    scanf("%d", &m);    while (m--)    {        scanf("%d", &key);        binary_search(a, n, key);    }    return 0;}void binary_search(int a[], int n, int key){    int l, r, mid;    int flag = 0;    l = 1;    r = n;    while (l <= r)    {        mid = (l + r) >> 1;        if (a[mid] == key)        {            flag = 1;            break;        }        else if (a[mid] < key)            l = mid + 1;        else            r = mid - 1;    }    if (flag)        printf("Yes\n");    else        printf("No\n");}

【心得体会】

0 0
原创粉丝点击