20221221 二分查找
题目描述
输入 nn 个不超过 10^910
9
的单调不减的(就是后面的数字不小于前面的数字)非负整数 a_1,a_2,\dots,a_{n}a
1
,a
2
,…,a
n
,然后进行 mm 次询问。对于每次询问,给出一个整数 qq,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1−1 。
输入格式
第一行 22 个整数 nn 和 mm,表示数字个数和询问次数。
第二行 nn 个整数,表示这些待查询的数字。
第三行 mm 个整数,表示询问这些数字的编号,从 11 开始编号。
输出格式
输出一行,mm 个整数,以空格隔开,表示答案。
AC代码
#include <bits/stdc++.h>
using namespace std;
int a[1000010];
int main(){
int n,m;
int x;
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
}
while(m--)
{
cin>>x;
int l = 1,r = n;//左边和右边
while(l < r)//如果左边任然小于右边 进入循环
{
int mid = l + r >> 1; //中间数
if(a[mid] >= x){//如果中间数 比 要找的数大
r = mid;//把右边缩到中间
}else{//否则
l = mid + 1;//把左边的数缩到中间
}
}
if(a[l] == x) cout<<l<<" ";
else cout<<-1<<" ";
}
return 0;
}