#65. Soubai的01string

Soubai的01string

题目背景

本题为交互题,如果对交互题的作答方式有疑问,请参考交互题

每次询问,你需要向标准输出输出一个整数,然后输出一个换行并清空缓冲区。

你可以使用如下语句来清空缓冲区:

  • 对于 C/C++:fflush(stdout);

  • 对于 C++:std::cout << std::flush;

  • 对于 Java:System.out.flush();

  • 对于 Python:stdout.flush();

  • 对于 Pascal:flush(output);

对于其他语言,请自行查阅对应语言的帮助文档。 特别的,对于 C++ 语言,在输出换行时如果你使用 std::endl 而不是 '\n',也可以自动刷新缓冲区。建议使用std::endl以避免忘记输出换行。

然后你需要从标准输入中输入一个整数,代表评测机返回的结果。

题目描述

Soubai造了一个长度为 nn (1n2105)(1\leq n \leq 2\cdot 10^5)且只由 0011 构成的字符串 SS,他不会把整个字符串给你看,因为他想和你玩一个游戏,游戏内容如下:

你每次可以向他询问一个位置 pospos,他会告诉你这个字符串的第 pospos 位是 00 还是 11

现在,他告诉你这个字符串的首位一定是 00 ,末位一定是 11,这样,一定保证存在至少一个 1i(n1)1\leq i\leq (n-1) 满足 SiSi+1S_i \neq S_{i+1},我们称这样的 ii好位置

你需要在 2020 次询问内告诉他一个好位置。(本题可能存在多个符合条件的解,你只需要返回任意一个即可)

输入和格式

首先,从标准输入接收字符串 SS 的长度 nn

NN

然后,你最多可以向判题机提出 2020 个问题,问题的格式如下(其中 ii 是满足 1iN1 \leq i \leq N 的整数):

? i?\texttt{ }i

每次提问后,判题机会从标准输入返回 SiS_i 的值,格式如下:

SiS_i

这里,SiS_i0011

当你找到一个满足题目条件的整数 pp 时,请按以下格式输出并立即结束程序:

! p!\texttt{ }p

如果存在多个解,输出其中任意一个即可。

输入输出样例 #1

在以下的交互中, n=7n = 7S=0010011S = 0010011.

输入 输出 描述
7 给定 nn
? 1 询问 S1S_1的值
0 测评机返回了 S1=0S_1 = 0.
? 6 询问 S6S_6 的值
1 测评机返回了 S6=1S_6 = 1.
? 5 询问了 S5S_5的值
0 测评机返回了 S5=0S_5 = 0.
! 5 回答 p=5p = 5 为一个好位置

对于回答 p=5p = 5, 我们有 1pn11 \leq p \leq n-1 并且 SpSp+1S_p \neq S_{p+1}. 因此,如果程序在此处立即退出,则本例将被判定为正确求解。

提示/说明

请注意提问和回答中字符和数字之间有空格!