Description
给出一个包含 n 个整数的有序序列,有 m 个询问,每个询问包含一个整数 xi ,找到序列中第一个大于等于 xi 的整数。
Input
有多组输入数据, 每组数据第一行包含一个整数n (n<=1000000),
和一个整数 m(m<=1000000), 接下来的 m 行每行一个整数xi.(-231<xi<231)
Output
对每组输入数据, 输出 m 行,第 i 行表示第 i 组询问的结果,如果不存在
该整数输出 No。
SampleInput
5 2
1 3 5 7 9
4
10
SampleOutput
5
No
解题分析:二分查找返回第一个 >= value 的数位置
二分代码:
#include<stdio.h> const int maxn = 105; int a[maxn]; int n,m,key; int Find(int a[], int l, int r, int value) { int ans = -1; while(l < r) { int mid = l + ((r - l) >> 1); if(a[mid] >= value) { ans = mid; r = mid; } else { l = mid + 1; } } return ans; } int main() { scanf("%d%d",&n,&m); for(int i = 0; i < n ; i++) scanf("%d",&a[i]); while(m--) { scanf("%d",&key); int ans = Find(a,0,n-1,key); if(ans == -1) printf("No\n"); else printf("%d\n",a[ans]); } return 0; }
当然也可以直接写,主要是为了更好地理解二分
#include<stdio.h> int main() { int a[105]; int n,m,key; scanf("%d%d",&n,&m); for(int i = 0 ; i < n; i++) scanf("%d",&a[i]); while(m--) { scanf("%d",&key); int ta; for(int i = 0; i < n ;i++) { ta = 0; if(a[i] >= key) { ta = i; break; } } if(ta == 0) printf("No\n"); else printf("%d\n",a[ta]); } return 0; }