23_VS_24 @ 2023-08-28 11:51:31
#include<bits/stdc++.h>
using namespace std;
int n,m;
int mag(int x,int a[])
{
int l=1;
int r=n;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]==x) return mid;
else if(x<a[mid]) r=mid-1;
else l=mid+1;
}
return -1;
}
int main()
{
int ask;
cin>>n>>m;
int *a=new int[n+5];
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
cin>>ask;
cout<<mag(ask,a)<<endl;
}
delete[] a;
return 0;
}
by zhaojianchao @ 2023-08-28 11:59:46
@23_VS_24 你可以用lower_bound
by zhaojianchao @ 2023-08-28 12:00:34
#include<bits/stdc++.h>
using namespace std;
int n,m,t,a[1000010];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
while(m--){
cin>>t;
int ans=lower_bound(a+1,a+1+n,t)-a;
if(a[ans]==t) cout<<ans<<" ";
else cout<<-1<<" ";
}
return 0;
}
by vanishingloser @ 2023-08-28 12:04:30
这题要找的是第一次,所以将第8行改为l<r,再将10-12行合并为
if(x<=a[mid])r=mid;
else l=mid+1;
这样或许就行了
by vanishingloser @ 2023-08-28 12:06:00
你的程序在出现多个相同的数时会随机找到其中的一个