二分查找
来源:互联网 发布:淘宝年费多少钱 编辑:程序博客网 时间: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;}