1. 二分查找
题目ID:1037必做题100分
最新提交:
Wrong Answer0 分
历史最高:
Wrong Answer80 分
时间限制: 1000ms
空间限制: 262144kB
题目描述
二分查找:输入 n 个从小到大的有序数,使用二分查找给定数 m 是否存在,如果有该数,则从左到右输出第一次出现的位置(计数从1开始),如果没有这样的数输出 0。
注意:待查找数字有若干个。
输入格式
第一行一个整数 n,第二行 n 个整数 ai表示要查找的有序数列,第三行若干个整数 m i表示要查找的数字(最多有
S 个)。
输出格式
对于每一个 mi ,输出它第一次出现的位置,用空格间隔,如果不存在,则输出 0。
样例
Input 1
7
1 2 4 4 5 7 9
4 5 2 10
Output 1
3 5 2 0
bsgm你代码被你吃了哪去了?
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N];
int n,x;
int main(){
cin>>n>>x;
for(int i = 1;i<=n;i++) cin>>a[i];
while(cin>>x){
int l = 1,r = n;
int ans = -1;
while(l<=r){
int mid = (l+r) / 2;
if(a[mid] >= x){
ans = mid;
r = mid - 1;
}
else if(a[mid] < x){
l = mid +1;
}
}
if(a[ans] == x) cout<<l<<"";
else cout<<0<< " ";
}
return 0;
}
代码
cin两次x了
7行的cin>>n>>x改成cin>>n
666,+5pts
你似乎也是普及1的
我也刚AC这道题
你把那个While( l<=R)的那个=给删了。
WA0分
l后面的""里面加空格
WA0分
把我说的两个方法都用上
都用了
我试过了AC了,你WA的输出结果多少
??
不要删while(l<=r)里的=
if(ans != -1 && a[ans] == x)
没必要,全按我的改可以AC
- cin>>n>>x改成cin>>n;
- cout<<l<<""改成
- cout<<l" ";
全局 int n,x; → int n,m;避开重名覆盖
while(cin>>x)→ while(m–)按次数查询
里面定义 int x; 做每次查询值
判定加 ans!=-1`防止 a[-1] 越界报错
![]()