NYOJ 86 找球号(一)

本文介绍了一种使用栈和二分查找算法来判断随机数是否存在于一组已排序的球号中的方法。通过栈的“先进后出”特性逆序存储随机数,再利用二分查找高效地确定这些数是否在球号列表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找球号(一)

题目来源:点击打开链接

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值