二分查找

来源:互联网 发布:淘宝年费多少钱 编辑:程序博客网 时间:2024/05/29 12:39
给定一列有序的数。查询其中第一个大于x的数的位置。位置下标从0开始。如果这列数中不存在大于x的数,则输出-1。


Input

每组输入由四行组成,第一行一个整数N(1≤N≤10,000),表示这列数是N。第二行有N个由空格隔开的数,表示这列有序的数。第三行一个整数Q(1≤N≤10,000),表示有Q次查询。第四行有Q个由空格分开的整数,表示查询第一个大于这个数的位置。

Output

输出Q个整数,回答Q次查询。这Q个整数由每20个一行,由空格分开。

Sample Input

7
10 10 20 20 20 30 30
2
15 25

Sample Output

2 5
算法思想: 住要采用二分查找, 判断出二分查找的中止条件即可 其他的  high = mid -1;  low  = mid +1 即可
代码:
#include<iostream>#include<cstdio>using namespace std;int main(){    int i, N , low, high, m;    int num[10001];    scanf("%d", &N);    for(i = 0; i < N; i++) scanf("%d", &num[i]);    scanf("%d", &m);    while(m--)    {        int goal;        cin>>goal;        low = 0;        high = N ;        int mid = -1;        while(low <= high)        {            mid = (low + high)/2;            //其实主要是下面这步            if ((num[mid] > goal ) && (num[mid-1] <= goal))            {                break;            }            else if(num[mid] > goal)            {                high = mid -1;            }            else            {                low = mid +1;            }        }        if(m>=1)        {            printf("%d ", mid);        }        else        {           printf("%d", mid);        }    }    return 0;}