zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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
    ", 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
    ", mi[cnt-1], ma[cnt-1]);
    31         fflush(stdout);
    32     }
    33     return 0;
    34 }
  • 相关阅读:
    linux 命令 # tar zcvf Work.tar.gz Work
    ODBC
    vmware 与机器共享
    关机!!!
    reador哦
    asp.net的三层架构图
    十大著名黑客——阿德里安拉莫
    十大著名黑客——查德斯德尔曼
    十大著名黑客——埃里克雷蒙德
    十大著名黑客——George Hotz
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6400986.html
Copyright © 2011-2022 走看看