好的,我一直在学习二进制搜索。我的老师给了我一个关于代码部队的问题,它总是在测试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是什么,但是我很乐意听到关于我的程序哪里错了的想法。我的猜测是它与猜测的数量有关。提前感谢!
我已经尝试了上面所写的循环的变体,但是它们都给予了相同的结果。
1条答案
按热度按时间ocebsuys1#
所以,如果你测试A,输出是“〈",那么你可以把max设为A-1。
假设由于某种原因,二分搜索达到了以下状态:
lo = 5,hi = 6(正确数字应为6)
它将输入if(hi == lo + 1)情况并返回5(这是不正确的)
让我知道如果这是足够的,因为它是更好的,如果你适应你的算法比我给你正确的实现。
“我自己学到的我还记得”