Codeforces 730B:Minimum and Maximum(交互式问题)

Posted Shadowdsp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Codeforces 730B:Minimum and Maximum(交互式问题)的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 1480C Searching Local Minimum(交互+二分)

Codeforces 805 D Minimum number of steps

Codeforces Round #411 (Div. 2)D. Minimum number of steps(贪心)

codeforces 1072D Minimum path bfs+剪枝 好题

CodeForces - 279D The Minimum Number of Variables 题解

CodeForces 279D The Minimum Number of Variables 题解