Description
Input
Output
Sample Input
5 1 3 5 7 9 3 1 5 8
Sample Output
1 3 -1
这道题就是直接的考察二分法查找。二分法即:先将要查找的数跟平均数比较,要是小于平均数的话就再跟前半部分的平局数比较,大于的话就与后半部分的平均数比较,以次类推。直到找到为止,输出对应下标;要是循环完还没找到则输出-1。
源代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[3000001];
int f(int m,int x,int y);
int main()
{ int n,i,m,N;
scanf("%d",&n);
for(i=1;i<=n;++i)
{ scanf("%d",&a[i]);
}
cin>>N;
while(N--)
{ scanf("%d",&m);
printf("%d\n",f(m,1,n));
}
}
int f(int m,int x,int y)
{ int z;
while(x<=y)
{ z=(x+y)/2;
if(m==a[z])return z;
else if(m<a[z]) y=z-1;
else x=z+1;
}
return -1;
}
需要注意的是这里的输入输入出要用scanf跟printf,要是用cin跟cout的话就会超时。因为scanf跟printf比cin跟cout用时短(我也是刚知道的,因为这超时了好几次。。。)。
本文介绍了一种基于二分查找算法解决特定问题的方法,通过给定的升序序列及若干查询,快速定位元素位置,提供了完整的C++实现代码。
785

被折叠的 条评论
为什么被折叠?



