c++ 如何修复二进制搜索算法?

idfiyjo8  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(135)

好的,我一直在学习二进制搜索。我的老师给了我一个关于代码部队的问题,它总是在测试2失败。下面是问题:
在这个问题中jury有一个数x,你必须猜测它,x总是一个从1到n的整数,其中n
在一开始就给了你。
可以对测试系统进行查询,每个查询都是从1到n的单个整数
。打印每个查询后刷新输出流。测试程序可以提供两种不同的响应:

the string "<" (without quotes), if the jury's number is less than the integer in your query;
the string ">=" (without quotes), if the jury's number is greater or equal to the integer in your query.

当您的程序猜测数字x时,打印字符串“!x”,其中x
就是答案,并在刷新输出流后立即正常终止程序。
您的程序最多可以向考试系统查询25次(不包括打印答案)。
输入
使用标准输入读取查询的响应。
第一行包含整数n(1≤n≤pow(10,6)-最大可能陪审团人数。
以下几行将包含对查询的响应-字符串“〈”或“〉="。第i行是对第i个查询的响应。当程序猜测数字时,打印“!x”,其中x
就是答案,终止你的程序
只有在您的程序为系统打印查询并执行刷新操作之后,测试系统才允许您读取查询的响应。输出
要进行查询,程序必须使用标准输出。
你的程序必须打印查询-整数xi(1≤xi≤n),每行一个查询(不要忘记每个xi后面的“行尾
)。打印完每一行后,程序必须执行刷新操作。
下面是我的代码:

#include <iostream>
    using namespace std;
    int main()
    {
        int n;
        string s;
        int k=0;
        cin>>n; 
        int min=1,max=n;
        int a;
        while(k==0)
        {
            if(max==min+1)
            {
                cout<<"! "<<min;
                k=1;
                break;
            }
            a=(min+max)/2;
            cout<<a<<endl;
            cin>>s;
            if(s==">=")
                min=a;
            else
                max=a;
                
        }
    }

我不知道测试2是什么,但是我很乐意听到关于我的程序哪里错了的想法。我的猜测是它与猜测的数量有关。提前感谢!
我已经尝试了上面所写的循环的变体,但是它们都给予了相同的结果。

ocebsuys

ocebsuys1#

所以,如果你测试A,输出是“〈",那么你可以把max设为A-1。
假设由于某种原因,二分搜索达到了以下状态:
lo = 5,hi = 6(正确数字应为6)
它将输入if(hi == lo + 1)情况并返回5(这是不正确的)
让我知道如果这是足够的,因为它是更好的,如果你适应你的算法比我给你正确的实现。
“我自己学到的我还记得”

相关问题