有时你会在编程比赛里遇到交互题(包括CF)
在这种问题中,输入的数据可能不是预先定好的,但是是为你的解答量身定做的。
评测人写了一个特殊的程序——interactor,这样它的输出对应着你的程序的输入,而你的输出又对映着它的输入。
换句话说,你的程序和 interactor 交换数据,而我的输出基于程序间的“历史交流记录”。
一般人为检验交互题的解答会远远难于常题,因为参与者要在检验过程中扮演 interactor 的角色。
一般 oi 场上的交互题都是使用 Grader 交互 和 stdio 交互。
stdio
对于这类题目,选手只需像往常一样将询问写到标准输出,刷新输出缓冲 后从标准输入读取结果。
选手程序刷新输出缓冲后,通过管道连接它的测评程序(称为交互器)才能立刻接收到这些数据。
因为如果你输出了一些数据,这些数据可能被放置于内部缓存区里,而且或许没有被直接传输给 interactor。
为了避免这种情况的发生,你需要每次输出时用一种特殊的清除缓存操作。
你可以使用如下语句来清空缓冲区:
- 对于 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`以避免忘记输出换行。**
然后你需要从**标准输入**中输入一个整数,代表评测机返回的结果。
交互题的输入输出远远小于其他题——尽量用 scanf/printf 代替 cin/cout。
IO 交互板子
#include <bits/stdc++.h> using namespace std;int L=1, R=1000000000, x; int main() {while (L<=R){int mid=L+R>>1;printf("%d\n", mid), fflush(stdout);scanf("%d", &x);if (x==0){printf("%d\n", mid), fflush(stdout);break;}else if (x==1) R=mid-1;else L=mid+1;} return 0; }