Codeforces 730B:Minimum and Maximum(交互式问题)
http://codeforces.com/problemset/problem/730/B
题意:一个交互式问题,给出一个n代表有n个数字,你可以问下标为x和y的数的大小,会给出">","<"或"=",要求询问次数不能超过 ,最后输出最小的数和最大的数的下标。
思路:很新奇的题目。先将两两比较整理出一个max数组和min数组,这个时候前后较大的一个会在max数组中,较小的会在min数组中,这个时候询问了n/2次。接着我们只要对每个组进行比较,因为较大的已经在max数组里面了,我们只要递推求得较大的,同理,也可以递推求得较小的。最后的答案就是最后的组了。
记得每次printf之后要fflush(stdout)。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int ma[55], mi[55]; 4 5 int main() { 6 int t; 7 scanf("%d", &t); 8 while(t--) { 9 int n; 10 scanf("%d", &n); 11 char s[3]; int cnt = 0; 12 for(int i = 1; i < n; i += 2, cnt++) { 13 printf("? %d %d\n", i, i + 1); 14 fflush(stdout); 15 scanf("%s", s); 16 if(s[0] == '>') ma[cnt] = i, mi[cnt] = i + 1; 17 else ma[cnt] = i + 1, mi[cnt] = i; 18 } 19 if(n & 1) { ma[cnt] = n, mi[cnt] = n; cnt++; } 20 for(int i = 1; i < cnt; i++) { 21 printf("? %d %d\n", ma[i-1], ma[i]); 22 fflush(stdout); 23 scanf("%s", s); 24 if(s[0] == '>') ma[i] = ma[i-1]; 25 printf("? %d %d\n", mi[i-1], mi[i]); 26 fflush(stdout); 27 scanf("%s", s); 28 if(s[0] == '<') mi[i] = mi[i-1]; 29 } 30 printf("! %d %d\n", mi[cnt-1], ma[cnt-1]); 31 fflush(stdout); 32 } 33 return 0; 34 }