P2249 【深基13.例1】查找
输入 n(n≤106) 个不超过 10^9的单调不减的(就是后面的数字不小于前面的数字)非负整数a1,a2,…,an,
然后进行 m(m≤105) 次询问。对于每次询问,给出一个整数 q(q≤10^9),要求输出这个数字在序列中的编号,如果没有找到的话输出 -1 。
输入格式:
第一行 2 个整数 n 和 m,表示数字个数和询问次数。
第二行 n 个整数,表示这些待查询的数字。
第三行 m 个整数,表示询问这些数字的编号,从 1 开始编号。
输出格式:m 个整数表示答案

思路:这道题采用二分法,何为二分法呢?个人见解就是在一个单调的数组中,先找出这个数组的中间值a,然后再将我们要找的这个数b与这个
中间值a比较,若是大于这个中间值,那么b就可能在左边,于是就得往左边移一步,left-1 若是小于a 那么就是在右边,rigth+1
所以,这道题我们先初始化l r,用mid代表中间位置,令mid=(l+r)/2
若num[mid]=x,则输出
若num[mid]>x,给定值在区间l和mid-1之间,r=mid-1,反则 l=mid+1
若找不到就输出-1
#include <stdio.h> int n,m,q,a[1000005]; int find(int x) //二分查找 { int l=1,r=n; while (l<r) { int mid=l+(r-l)/2; if (a[mid]>=x) r=mid; else l=mid+1; } if (a[l]==x) return l; //找都了就输出他的位置 else return -1; // 没找到输出-1 } int main() { scanf("%d %d",&n,&m); //读入 for (int i=1 ; i<=n ; i++) scanf("%d",&a[i]); //还是读入 for (int i=1 ; i<=m ; i++) { scanf("%d",&q); int ans=find(q); //看看查找的结果 printf("%d ",ans); //输出 } return 0; }

浙公网安备 33010602011771号