交互题目
题意的解释 :
样例给的输入不代表你程序的输入,没有参考意义。输入 n , 另一个输入是 tmp ;
tmp 是 每次令 x + c 后 x + c / n 的结果 , 就是tmp ,他是程序的输入 ,因为打印了 + c
对应测试程序会输出一个值,那么他变成输入的tmp .
对二分的理解
/*
* 1. 我们先假设 x = mid;* 2. c的设置,c 取 (n - x) % n 让 (mid + c) / n 刚好 + 1 , 如果 x + c 也就是tmp 不等于 (mid + c) / n , 那么 x 是 < mid 的
* 否则 x 是 >= mid 那么就可以进行二分.* 3. 上面只是考虑了第一步, mid 代表的是初始值,
* mid + c + all ; all 是前面一共加上的,此时 x = x + all;
* 将c 同理设置成 (mid + all) % n, 那么就是只有 >= mid 的数才会 (mid + all + c) / n > (mid + all) / n;
*/
#include<iostream>
using namespace std;
int ask(int c)
{
cout << "+" << " " << c << endl;
int tmp;
cin >> tmp;
return tmp;
}
int main()
{
int n;
cin >> n;
int l = 1, r = n - 1,add = 0;
while (l < r)
{
int mid = l + r + 1 >> 1;
int c = (n - (mid + add) % n);
int want = (mid + add + c) / n;
add += c; // add 表示一共增加
int real = ask(c);
if (real == want)
{
l = mid;
}
else
{
r = mid - 1;
}
}
cout << "!" << " " << l + add << endl;
}