题解+思路
2025-10-05 09:27:53
发布于:广东
3阅读
0回复
0点赞
题解(思路在代码里)
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000000+5];
int main(){
//下面三行也可以删掉(加速)
ios::sync_with_stdio(false);//加速
cin.tie(0);//加速
cout.tie(0);//加速
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
while(m--){
int x;scanf("%d",&x);
/*二分查找:
1.找到上下界
2.找到中间值
3.分类讨论:
(1):中间值对应的数组中的值
比查找的数x大,就将右边界移到中间
(向更小的范围靠拢,删除右边界)
(2):中间值对应的数组中的值
比查找的数x小,就将左边界移到中间
(向更大的范围靠拢,删除左边界)
(3):找到了,由于要找第一个出现的,
就往左边找
(删除右边界)
*/
int l=1,r=n,mid,ans=-1;//1
while(l<=r){
mid=(l+r)/2;//2
//3
if(a[mid]>x){//(1)
r=mid-1;
}else if(a[mid]<x){//(2)
l=mid+1;
}else{//(3)
ans=mid;
r=mid-1;
}
}
printf("%d ",ans);//空格不要漏了~~
}
return 0;
}
这里空空如也
有帮助,赞一个