本题思路:
这是一道交互式的题
根据题意可知:如果x=y, 火箭回答0,如果x>y,火箭回答1
那么便考虑询问为 y=1 时,正确答案只能为1或0。由于n不超过30,因此我们的前30次询问可以全部为
y=1,这样就可以知道数列 p 的每一项的值。当知道了p的每一项的值以后就可以依照p的值在1~m的范围
内二分出正确答案 1 ≤ m ≤ 109那么log2m约等于30即可在30步之内求解出答案
题目描述
(中文翻译版本)
这是个交互式问题。
老衲想要坐火箭飞去火星。但是去火星的路过于漫长无聊。他只能不停的计算当前到火星的距离
我们定义x为到火星的距离,老衲并不知道这个x,但他知道数字m,而x满足1 ≤ x ≤ m。(x和m都是正整数。)
众所周知,火箭是会说话的。所以老衲可以问火箭一些问题,每个问题用一个正整数y来表示 (1 ≤ y ≤ m)。如果x[HTML_REMOVED]y,火箭回答1。 但是,火箭看起来智力不高,她有时会回答错误。 具体来说:假设火箭应当的正确回答为z,如果火箭回答正确,她会回答z,如果回答错误,她会回答-z。
火箭拥有一个长度为n序列p。序列p中的每个元素都是0或1。火箭会循环处理这个序列,也就是1号元素,2号元素,3号元素,…,(n-1)号元素,n号元素,1号元素,2号元素。当处理到的元素值为1时,火箭会回答正确答案z,否则会回答-z。老衲并不知道序列p的具体元素,但他知道序列p的长度n是多少
你可以问火箭不超过60个问题。
请帮助老衲确定到火星的距离,假定老衲询问时到火星的距离始终不变。
如果火箭没有回答出0,则你的解法不会被接受(即使从火箭的回答已经能够推断出正确距离).
Input
第一行包含两个整数m和n。(1 ≤ m ≤ 109,1 ≤ n ≤ 30) — 距离x的最大值和序列p的长度
Interaction
你可以询问火箭不超过60个问题。
对于你的每个询问,火箭会输出一个整数y (1≤ y≤ m)和一个回车符,然后你需要进行flush操作并读入火箭的回答。
如果你的程序读入到了0,则说明距离已经正确,请立刻终止程序,不要再进行提问。如果忽略了这一点会导致一些奇怪的报错。
如果在某个时刻你的程序读到-2作为回答,请立刻结束你的程序。你会得到 “Wrong answer” 。这意味着你的询问格式不正确或者你没有能在60步以内得到正确答案。
如果你的询问不是一个合法的整数,你可能得到任何奇怪的错误。
你会得到 “Idleness limit exceeded” 如果你没有任何输出或没有进行flush操作。
在每次询问之后,请使用一下命令进行flush
fflush(stdout) in C++;
System.out.flush() in Java;
stdout.flush() in Python;
flush(output) in Pascal;
其他语言请参考相关文档
样例
Example
Input
5 2
1
-1
-1
1
0
Output
1
2
4
5
3
#include <iostream>
int n, m;//n为序列p的长度 m为距离x的最大值
int p[35];
int ask(int a)
{
printf("%d\n",a);//火箭的回答
fflush(stdout);//每次询问之后使用一下命令进行flush
int tmp;
scanf("%d",&tmp);//读入回答
return tmp;
}
void solve(int l, int r, int cur) //二分 如果x<y, 火箭回答-1, 如果x=y, 火箭回答0,如果x>y,火箭回答1。
{
int mid = (l + r)>>1;
int ans = ask(mid) * p[cur % n];
if (ans == 0) exit(0);
else if (ans == -1) solve(l, mid, cur + 1);
else solve(mid + 1, r, cur + 1);
} // 第 cur 次询问
int main()
{
scanf("%d%d",&m,&n);
for (int i = 0; i < n; i++)
{
p[i] = ask(1);
if (p[i] == 0) exit(0); // 如果正确 答案就是 1,退出程序
}
solve(1, m, 0);
return 0;
}