lys_99 @ 2024-05-21 20:13:58
#include<bits/stdc++.h>
using namespace std;
int a[100000009],n,m,q;
int find(int x){
int l=1,r=n+1;
while(l<r){
int mid=l+(r-1)/2;
if(a[mid]>=x){
r=mid;
}
else l=mid+1;//多个相同数中找最小编号
/*
if(a[mid]<=x)l=mid+1;
else r=mid;
多个相同数中找最大编号
*/
}
if(a[l]==x){
return l;
}
else return -1;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>q;
cout<<find(q)<<" ";
}
return 0;
}
by Justin_love_coding @ 2024-05-21 20:29:29
mid = l + (r - l) / 2,l写成1了
by Justin_love_coding @ 2024-05-21 20:29:58
@lys_99
by lys_99 @ 2024-05-21 20:36:47
谢谢 大佬
by zeroeleven @ 2024-05-21 20:36:53
建议用upper_bound函数
你的代码交上去应该是TLE而不是WA
如果不会用的upper_bound话,建议还是改一下:
1.输入输出量较大,建议用scanf;
2.在第二个for里,应该是存下要输出的数,然后统一输出;
3.检查一下find函数里的while是否有问题(虽然我没看出来)