这是一道交互题。
小修和小栋喜欢玩一个叫做猜数字的游戏。
小修会先在心中想好一个包含 个互不相同的正整数的序列 。
小栋每次会向小修询问 的中位数,小修会准确地回答。然后小栋则需要利用这些信息来尽可能地还原出序列 。
然而小修实在是太厉害了,选取的 都会特别大,导致小栋根本不知如何处理。
请你帮助小栋,让他能和小修愉快地玩耍。
任务介绍
你需要实现一个函数 guess()
,以帮助小栋完成游戏。
在每个测试点中,交互库都会调用恰好一次 guess()
函数。
你可以调用函数 ask()
来向小修进行询问。我们会根据你调用这个函数的总次数评分。
ask(x,y,z)
x,y,z
为三个不同的下标
- 这个函数会返回 的中位数。
同时,你还可以调用函数 answer()
来回答你还原出的信息。
answer(x,v)
x
为还原出的数的下标
v
为还原出的 的值
你不能对于同一个 进行两次调用,但可以对于某些 不进行调用,表示你不能还原出这个下标上的值。
实现方法
本题只对 C/C++ 提供函数接口。其他语言请使用标准输入/输出进行交互。
源代码中需要包含头文件 guess.h
。
你需要实现的函数 guess()
:
函数 ask()
的接口信息如下:
int ask(int x,int y,int z);
函数 answer()
的接口信息如下:
void answer(int x,int v);
如何测试你的程序
你需要在本题目录下使用如下命令编译得到可执行程序:
g++ -o guess grader.cpp guess.cpp -O2
可执行文件将从标准输入读取以下格式的数据:
第一行包含一个正整数 ,需要保证 。
第二行一共 个正整数,,需要保证 互不相同且 。
读入完成之后,交互库将会调用 guess()
函数。
接下来交互库将会在标准输出中输出以下信息:
第一行一共 个正整数,,表示你还原出的序列, 表示你没有还原出该下标上的值。
第二行形如 Count: cnt
,cnt
为你调用函数 ask()
的次数。
样例源代码
在本题目录下,有 C++ 语言的样例源代码 guess.cpp
。按照上文中提到的方式进行编译,即能通过编译得到可执行程序。
样例源代码只是帮助理解题目,结果不一定正确。
其他语言
C/C++ 以外的语言可以通过标准输入输出进行交互。
程序开始时,从标准输入读入一行,包含正整数 。
此后,需要调用 ask()
时,向标准输出输出一行 Ask <x> <y> <z>
并刷新输出缓冲(例如 Pascal 语言的 flush(output)
和 Java 语言的 System.out.flush()
,其他语言请参阅语言文档);此后从标准输入读入一行,包含一个整数,表示询问结果。
需要调用 answer()
时,向标准输出输出一行 Answer <x> <v>
并刷新输出缓冲。
程序结束时输出一行 Finish
并退出。
所有输出同样需要满足上述限制。