CF727C Guess the Array
题目描述
这是一个交互题。你需要在每输出一行后执行刷新操作。例如,在 C++ 中你应该使用 fflush(stdout),在 Java 中使用 System.out.flush(),在 Pascal 中使用 flush(output)。
本题要求你猜测一个你并不知道的数组 $a$。你唯一已知的信息是数组 $a$ 的长度 $n$。
你唯一允许的操作是通过指定两个不同下标,询问它们在数组中的和。具体来说,你可以输出两个下标 $i$ 和 $j$(要求 $i \ne j$),然后你的程序会读入一个整数作为响应,这个整数等于 $a_{i} + a_{j}$。
可以证明,最多进行 $n$ 次询问后,你总能猜出整个数组。
请你写一个程序,在最多 $n$ 次询问后,猜出数组 $a$。
输入格式
输入的第一行为一个整数 $n$($3 \leq n \leq 5000$),表示数组 $a$ 的长度。你的程序一开始就需要读取这个值。
之后你的程序应该按照下面两种形式与评测系统进行交互:
- 当你的程序询问数组中两个元素的和时,应该输出一行,格式为 “? i j”($i$ 和 $j$ 是不同的整数,且 $1 \leq i, j \leq n$),其中 $i$ 和 $j$ 代表数组 $a$ 的下标。
- 当你的程序认为已经猜出整个数组时,应该输出一行,格式为 “$!~a_{1}~a_{2}~...~a_{n}$”,其中 $a_{i}$ 表示数组 $a$ 的第 $i$ 个元素。保证所有 $a_{i}$ 都是 $1$ 到 $10^5$ 之间的正整数。
对于每一次询问,你将收到一个单独的整数作为响应,这个响应等于 $a_{i} + a_{j}$。
你的程序最多只能进行 $n$ 次询问。“$!~a_{1}~a_{2}~...~a_{n}$” 这一行不计入请求次数。
每次输出后都不要忘记刷新输出缓冲区。
输出了猜测的数组后,程序应正常结束。
输出格式
每次询问格式为:
“? i j”
- $1 \leq i, j \leq n$,$i \ne j$
猜测出数组时输出格式为:
“!~a_{1}~a_{2}~...~a_{n}$”
- $1 \leq a_{i} \leq 10^5$
说明/提示
hack 测试的格式如下:
- 第一行为一个整数 $n$($3 \leq n \leq 5000$),表示数组的长度。
- 第二行为 $n$ 个整数 $a_{1}, a_{2}, ..., a_{n}$($1 \leq a_{i} \leq 10^5$),表示需要猜测的数组元素。
由 ChatGPT 5 翻译