【题目描述】输入n个数和m,用二分查找找出与m一样的数的最小编号,n个数需要从小到大排列。
【输入要求】3行,第一行一个整数n(<=100);
第2行n个整数,每个整数之间用空格隔开;
第三行一个整数m。
【输出要求】1行,输出与m一样且编号最小的数。
【输入样例】
4
1 2 2 3
2
【输出样例】2
!首先我们看输入和输出样例,发现这道题的数组下标是从1开始的,首先咱们先定义变量:
int n,a[101],m;
输入:
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
接着就是二分查找部分:
首先,我们定义一个中间mid,首项l和末项r
然后给l与r赋初始值。
int mid;
int l=1,r=n;
接着进入while循环,进入条件就是l<r时。
然后给mid赋值。
mid=(首+末)/2;
while(l<r){
mid=(l+r)/2;
}
再来就是进行判断:
if(a[mid]==m) break;
//如果m>a[mid],那么需要改变l的位置
if(a[mid]<m) l=mid+1;
//如果m<a[mid],那么需要改变r的位置
else r=mid-1;
二分查找部分完成了,
接着我们要完成编号最小。
int index=mid;
while(a[index-1]==m) index--;
输出:
cout<<index;
完整代码:
#include<iostream>
using namespace std;
int main(){
int n,a[101],m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>m;
int mid;
int l=1,r=n;
while(l<r){
mid=(l+r)/2;
if(a[mid]==m) break;
//如果m>a[mid],那么需要改变l的位置
if(a[mid]<m) l=mid+1;
//如果m<a[mid],那么需要改变r的位置
else r=mid-1;
}
int index=mid;
while(a[index-1]==m) index--;
cout<<index;
return 0;
}