二分查找,错在哪儿了啊
在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号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;
}
} 你的代码中存在一些错误,导致程序无法正常运行。
首先,在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]