鱼C论坛

 找回密码
 立即注册
查看: 798|回复: 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”。
  1. #include<iostream>
  2. using namespace std;

  3. int main()
  4. {
  5.         int n,m,i;
  6.         cin>>n>>m;
  7.         int Mnum[100000],Nnum[10000];
  8.         for(i=0;i<m;i++)
  9.                 cin>>Mnum[i];
  10.         for(i=0;i<n;i++)
  11.                 cin>>Nnum[i];
  12.         for(i=0;i<n;i++)
  13.         {
  14.                 int left=0,right=m,mid=(left+right)/2,flag=Nnum[i],set=0;
  15.                 while(left<right)
  16.                 {
  17.                         if(Mnum[mid]==flag)
  18.                         {
  19.                                 cout<<"YES"<<endl;
  20.                                 set=1;
  21.                                 break;
  22.                         }
  23.                         if(Mnum[mid]>=flag)
  24.                         {
  25.                                 right=mid;
  26.                         }
  27.                         if(Mnum[mid]<=flag)
  28.                         {
  29.                                 left=mid+1;
  30.                         }
  31.                         mid=(left+right)/2;
  32.                 }
  33.                 if(!set) cout<<"NO"<<endl;
  34.         }
  35. }
复制代码
小甲鱼最新课程 -> https://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赋值。根据题目描述,应该是每行输入一个整数,代表球的编号。因此,你需要在循环内部添加如下代码:
  1. cin >> arr[i];
复制代码


最后,你的二分查找算法写得不正确。以下是一个正确的二分查找算法示例代码:
  1. bool binarySearch(int arr[], int left, int right, int target){
  2.     while(left <= right){
  3.         int mid = left + (right - left) / 2;
  4.         if(arr[mid] == target){
  5.             return true;
  6.         }
  7.         else if(arr[mid] < target){
  8.             left = mid + 1;
  9.         }
  10.         else{
  11.             right = mid - 1;
  12.         }
  13.     }
  14.     return false;
  15. }
复制代码

你可以在主函数中调用这个函数来进行二分查找。

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

  3. bool binarySearch(int arr[], int left, int right, int target){
  4.     while(left <= right){
  5.         int mid = left + (right - left) / 2;
  6.         if(arr[mid] == target){
  7.             return true;
  8.         }
  9.         else if(arr[mid] < target){
  10.             left = mid + 1;
  11.         }
  12.         else{
  13.             right = mid - 1;
  14.         }
  15.     }
  16.     return false;
  17. }

  18. int main()
  19. {
  20.     int Mnum, Nnum;
  21.     cin >> Mnum >> Nnum;

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

  26.     int target;
  27.     for(int i = 0; i < Nnum; i++){
  28.         cin >> target;
  29.         bool result = binarySearch(arr, 0, Mnum-1, target);
  30.         if(result){
  31.             cout << "YES" << endl;
  32.         }
  33.         else{
  34.             cout << "NO" << endl;
  35.         }
  36.     }

  37.     delete[] arr;

  38.     return 0;
  39. }
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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