找球号(一)
题目来源:点击打开链接
题目信息:这道题,是判断一个随机数是否在另一列数中间。主要就是一个二分法查找,先对一堆球号数排序,这里用到了sort排序。
sort排序默认的是升序,在头文件<algorithm>中。因为最近在练习栈的应用,所以这道题也用到了栈模拟。
由于栈的性质是"先进后出",所以需要把随机数逆序进栈。这样判断栈顶元素是否在球衣号中才是顺序的。
源代码:(栈的应用)
#include<stdio.h>
#include<algorithm>
#include<stack>
using namespace std;
int a[1000005],b[1000005];
int fun(int a[],int b,int c) //判断b是否在数组a[]中,c是a[]的长度
{
int start=0,end=c-1;
while(start<=end) //二分法查找
{
if(b<a[(start+end)/2])
end=(start+end)/2-1;
if(b>a[(start+end)/2])
start=(start+end)/2+1;
if(b==a[(start+end)/2])
return 1;
}
return 0;
}
int main()
{
stack<int>S;
int m,n,i;
scanf("%d%d",&m,&n);
for(i=0;i<m;i++)
scanf("%d",&a[i]);
sort(a,a+m); //将球号按从小到大的顺序排序
for(i=0;i<n;i++)
scanf("%d",&b[i]);
for(i=n-1;i>=0;i--) //注意,栈是先进后出。所以要倒叙进栈
S.push(b[i]);
while(!S.empty())
{
if(fun(a,S.top(),m))
{
printf("YES\n");
S.pop();
continue;
}
else
{
printf("NO\n");
S.pop();
continue;
}
}
return 0;
}
下面是直接用二分法进行查找
源代码:(直接二分法)
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
long long a[1000005];
/*int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}*/
int main()
{
int m,n,i,j,k;
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
scanf("%lld",&a[i]);
sort(a,a+m);
//qsort(a,m,sizeof(a[0]),cmp); //这里用qsort排序需要自己编写比较函数cmp
for(i=0;i<n;i++)
{
scanf("%d",&k);
int low=0,hight=m-1,mid=0,t=0;
while(low<hight)
{
mid=(hight+low)/2;
if(k==a[mid])
{
t=1;
break;
}
else if(k>a[mid])
low=mid+1;
else
hight=mid-1;
}
if(t==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}