zoukankan      html  css  js  c++  java
  • AtCoder Regular Contest 078 E

    E - Awkward Response


    Time limit : 2sec / Memory limit : 256MB

    Score : 800 points

    Problem Statement

    This is an interactive task.

    Snuke has a favorite positive integer, N. You can ask him the following type of question at most 64 times: "Is n your favorite integer?" Identify N.

    Snuke is twisted, and when asked "Is n your favorite integer?", he answers "Yes" if one of the two conditions below is satisfied, and answers "No" otherwise:

    • Both nN and str(n)≤str(N) hold.
    • Both n>N and str(n)>str(N) hold.

    Here, str(x) is the decimal representation of x (without leading zeros) as a string. For example, str(123)= 123 and str(2000) = 2000. Strings are compared lexicographically. For example, 11111 < 123 and 123456789 < 9.

    Constraints

    • 1≤N≤109

    Input and Output

    Write your question to Standard Output in the following format:

    ? n
    

    Here, n must be an integer between 1 and 1018 (inclusive).

    Then, the response to the question shall be given from Standard Input in the following format:

    ans
    

    Here, ans is either Y or NY represents "Yes"; N represents "No".

    Finally, write your answer in the following format:

    ! n
    

    Here, n=N must hold.


    Judging

    • After each output, you must flush Standard Output. Otherwise you may get TLE.
    • After you print the answer, the program must be terminated immediately. Otherwise, the behavior of the judge is undefined.
    • When your output is invalid or incorrect, the behavior of the judge is undefined (it does not necessarily give WA).

    Sample

    Below is a sample communication for the case N=123:

    InputOutput
      ? 1
    Y  
      ? 32
    N  
      ? 1010
    N  
      ? 999
    Y  
      ! 123
    • Since 1≤123 and str(1)≤str(123), the first response is "Yes".
    • Since 32≤123 but str(32)>str(123), the second response is "No".
    • Since 1010>123 but str(1010)≤str(123), the third response is "No".
    • Since 999≥123 and str(999)>str(123), the fourth response is "Yes".
    • The program successfully identifies N=123 in four questions, and thus passes the case.

    首先确定位数len,再确定前(len-1)位,再确定最后一位。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<iostream>
    #include<queue>
    #include<map>
    #include<cmath>
    #include<set>
    #include<stack>
    #define ll long long
    #define pb push_back
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)>(y)?(y):(x))
    #define cls(name,x) memset(name,x,sizeof(name))
    #define pos first
    #define index second
    #define mp make_pair
    using namespace std;
    const int inf=1e9+10;
    const ll llinf=1e16+10;
    const int maxn=2e5+10;
    const int maxm=1e2+10;
    const int mod=1e9+7;
    int n;
    char op[10];
    int init()
    {
        int k=10;
        for(int i=1;i<=9;i++)
        {
            printf("? %lld
    ",k);
            fflush(stdout);
            scanf("%s",op);
            if(op[0]=='N')
                return i;
            k=k*10;
        }
        k=9;
        for(int i=1;i<=9;i++)
        {
            printf("? %lld
    ",k);
            fflush(stdout);
            scanf("%s",op);
            if(op[0]=='Y')
                return i;
            k=k*10+9;
        }
        return 10;
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int len=init();
        if(len==10)
        {
            printf("! %d
    ",(int)1e9);
            return 0;
        }
        int ans=0;
        for(int i=1;i<len;i++)
        {
            int l=0,r=9,t=0;
            while(l<=r)
            {
                int mid=(l+r)/2;
                printf("? %d
    ",ans*10+mid);
                fflush(stdout);
                scanf("%s",op);
                if(op[0]=='Y')
                {
                    t=max(t,mid);
                    l=mid+1;
                }
                else
                    r=mid-1;
            }
            ans=ans*10+t;
        }
        for(int i=(len==1?1:0);i<=9;i++)
        {
            printf("? %lld
    ",((ll)ans*10+i)*10);
            fflush(stdout);
            scanf("%s",op);
            if(op[0]=='Y')
            {
                ans=ans*10+i;
                break;
            }
        }
        printf("! %d
    ",ans);
        return 0;
    }
  • 相关阅读:
    IE8使用chrome内核渲染
    JS中的call()方法和apply()方法用法总结(挺好 转载下)
    解决雷达图文字显示不全问题
    echarts legend文字配置多个颜色(转)
    vue中Axios的封装和API接口的管理
    echarts 折线拐点收藏
    echarts 折线图自定义颜色与修改legend颜色
    MUI框架 按钮点击响应不好的问题解决办法
    ECharts将折线变平滑和去掉点的属性
    单例模式——创建型模式01
  • 原文地址:https://www.cnblogs.com/mgz-/p/7189908.html
Copyright © 2011-2022 走看看