初莫M 发表于 2024-4-1 19:30:09

二分查找,错在哪儿了啊

在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号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,Nnum;
        for(i=0;i<m;i++)
                cin>>Mnum;
        for(i=0;i<n;i++)
                cin>>Nnum;
        for(i=0;i<n;i++)
        {
                int left=0,right=m,mid=(left+right)/2,flag=Nnum,set=0;
                while(left<right)
                {
                        if(Mnum==flag)
                        {
                                cout<<"YES"<<endl;
                                set=1;
                                break;
                        }
                        if(Mnum>=flag)
                        {
                                right=mid;
                        }
                        if(Mnum<=flag)
                        {
                                left=mid+1;
                        }
                        mid=(left+right)/2;
                }
                if(!set) cout<<"NO"<<endl;
        }
}

FishC 发表于 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;

最后,你的二分查找算法写得不正确。以下是一个正确的二分查找算法示例代码:
bool binarySearch(int arr[], int left, int right, int target){
    while(left <= right){
      int mid = left + (right - left) / 2;
      if(arr == target){
            return true;
      }
      else if(arr < 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 == target){
            return true;
      }
      else if(arr < target){
            left = mid + 1;
      }
      else{
            right = mid - 1;
      }
    }
    return false;
}

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

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

    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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 二分查找,错在哪儿了啊