NYOJ 86 找球号(一)

来源:互联网 发布:用java实现四则运算 编辑:程序博客网 时间:2024/05/18 17:58

找球号(一)

题目来源:点击打开链接

题目信息:这道题,是判断一个随机数是否在另一列数中间。主要就是一个二分法查找,先对一堆球号数排序,这里用到了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;}


0 0