鱼C论坛

 找回密码
 立即注册
查看: 373|回复: 1

二分查找,错在哪儿了啊

[复制链接]
发表于 2024-4-1 19:30:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0≤i≤100000000),编号可重复,现在说一个随机整数k(0≤k≤100000100),判断编号为k的球是否在这堆球中(存在为“YES”,否则为“NO”),先答出者为胜。 现在有一个人想玩玩这个游戏,但他又很懒。他希望你能帮助他取得胜利!
输入
有多行。第一行有两个整数m,n(0<n<=10000,0<m<=100000),m表示这堆球里有m个球(编号由小到大已排好序),n表示这个游戏进行n次。
接下来有m+n个整数,前m个分别表示这m个球的编号i,后n个分别表示每次游戏中的随机整数k。
输出
仅一行。“YES”或“NO”。
#include<iostream>
using namespace std;

int main()
{
        int n,m,i;
        cin>>n>>m;
        int Mnum[100000],Nnum[10000];
        for(i=0;i<m;i++)
                cin>>Mnum[i];
        for(i=0;i<n;i++)
                cin>>Nnum[i];
        for(i=0;i<n;i++)
        {
                int left=0,right=m,mid=(left+right)/2,flag=Nnum[i],set=0;
                while(left<right)
                {
                        if(Mnum[mid]==flag)
                        {
                                cout<<"YES"<<endl;
                                set=1;
                                break;
                        }
                        if(Mnum[mid]>=flag)
                        {
                                right=mid;
                        }
                        if(Mnum[mid]<=flag)
                        {
                                left=mid+1;
                        }
                        mid=(left+right)/2;
                }
                if(!set) cout<<"NO"<<endl;
        }
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-1 19:30:39 | 显示全部楼层
你的代码中存在一些错误,导致程序无法正常运行。

首先,在for循环的条件判断中,应该使用小于号(<)而不是大于号(>)。所以修改第一个for循环为:`for(i=0;i<Mnum;i++)`,修改第二个for循环为:`for(i=0;i<Nnum;i++)`。

其次,你在循环内部没有给数组arr和n赋值。根据题目描述,应该是每行输入一个整数,代表球的编号。因此,你需要在循环内部添加如下代码:
cin >> arr[i];

最后,你的二分查找算法写得不正确。以下是一个正确的二分查找算法示例代码:
bool binarySearch(int arr[], int left, int right, int target){
    while(left <= right){
        int mid = left + (right - left) / 2;
        if(arr[mid] == target){
            return true;
        }
        else if(arr[mid] < target){
            left = mid + 1;
        }
        else{
            right = mid - 1;
        }
    }
    return false;
}
你可以在主函数中调用这个函数来进行二分查找。

综合起来,以下是一个修正后的代码示例:
#include <iostream>
using namespace std;

bool binarySearch(int arr[], int left, int right, int target){
    while(left <= right){
        int mid = left + (right - left) / 2;
        if(arr[mid] == target){
            return true;
        }
        else if(arr[mid] < target){
            left = mid + 1;
        }
        else{
            right = mid - 1;
        }
    }
    return false;
}

int main()
{
    int Mnum, Nnum;
    cin >> Mnum >> Nnum;

    int *arr = new int[Mnum];
    for(int i = 0; i < Mnum; i++){
        cin >> arr[i];
    }

    int target;
    for(int i = 0; i < Nnum; i++){
        cin >> target;
        bool result = binarySearch(arr, 0, Mnum-1, target);
        if(result){
            cout << "YES" << endl;
        }
        else{
            cout << "NO" << endl;
        }
    }

    delete[] arr;

    return 0;
}

希望能够帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 19:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表