注:本文含交互题 endl 与 fflush 不同种类的配合使用效果的 测试(见 “四”)
一. 审题:
1. 前提条件:
2. 询问 & 输入:
3. 输出:
- 数组中所有数的值。格式:
! a[1] a[2] a[3] ... a[n]
二. 思路
1. 思考解法
我们可以不一口气把 n 次都询问完(当然最后肯定是都要询问完的),既然 n 个数询问 n 次一定有解,那么我们可以先询问 a1+a2 , a2+a3 以及 a3+a1 。这样就能先计算出 a1,a2 以及 a3。
只要有了一个数的具体值,我们每询问一次就可以算出一个数的具体值,这样一气呵成,避免了一口气询问完后堆积过多条件无从下手的情况。
2. 具体实现
-
前三个数:
解法有很多,如
⎩⎨⎧x+y=ay+z=bz+x=c
⟹2x+2y+2z=a+b+c
⟹x+y+z=2a+b+c
⟹x=2a+b+c−b
y,z 同理。
-
剩下的数:
接下来询问a1+a4,a1+a5 . . . a1+an。
三. 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include<bits/stdc++.h> using namespace std; const int MAXn = 5000;
int n; int add12,add13,add23; int add[MAXn + 10]; int first; int main() { scanf("%d", &n); cout << "? 1 2" << endl; scanf("%d", &add12); cout << "? 2 3" << endl; scanf("%d", &add23); cout << "? 1 3" << endl; scanf("%d", &add13); first = (add13 - add23 + add12) >> 1; for (int i = 4 ; i <= n; ++i) { cout << "? 1 " << i << endl; scanf("%d", &add[i]); } cout << "! " << first; fflush(stdout); cout << ' ' << add12 - first; fflush(stdout); cout << ' ' << add23 - add12 + first; fflush(stdout); for(int i = 4; i <= n; ++i) { cout << ' ' << add[i] - first; } }
|
四. endl 与 fflush
对交互题来说,弄清楚 endl
和 fflush
怎么用格外重要。不多废话了,直接摆上测试结果:
结论:endl
后面 不用跟 fflush
,但如果没有 endl
(或是用 printf
)要加上 fflush(stdout)
。