zoukankan      html  css  js  c++  java
  • Codeforces 862D. Mahmoud and Ehab and the binary string 【二分】(交互)

    <题目链接>

    题目大意:

    有一个长度为n(n<1000)的01串,该串中至少有一个0和一个1,现在由你构造出一些01串,进行询问,然后系统会给出你构造的串与原串的   Hamming distance ,现在要求你按照步骤进行交互式操作,最终得到任意一个0、1的下标。

    解题分析:
    因为原串中至少存在一个0和一个1,所以一定存在一个01或者10序列,因此我们可以用二分来寻找这个序列(注意二分过程中选择区间的操作)。二分之后,一定能够得到01或10序列,然后将其按先0后1的顺序输出即可。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 using namespace std;
     5 
     6 int main(){
     7     ios::sync_with_stdio(false);
     8     int n,num;cin>>n;
     9     puts("?");
    10     for(int i=1;i<=n;i++)cout<<"0";
    11     puts("");
    12     cin>>num;      //第一次交互,先得到序列中1的个数
    13     int l=1,r=n;
    14     while(r-l>=2){             //二分寻找01或10串
    15         int mid=(l+r)>>1;
    16         puts("?");                         
    17         for(int i=1;i<=n;i++){                  //这里的区间判定方法很难想
    18             if(i>=l && i<=mid)cout<<"1";
    19             else cout<<"0";
    20         }puts("");
    21         int x1;cin>>x1;
    22         if(abs(num-x1)==(mid-l+1))l=mid;      //判断左区间是否全为0或全为1,因为我们需要查找的是01串,所以需要向含有01串的地方收敛
    23         else r=mid;
    24     }
    25     //得到了10或01串的位置后,判断其中0、1的位置
    26     puts("?");
    27     for(int i=1;i<=n;i++){
    28         if(i==l)cout<<"1";
    29         else cout<<"0";
    30     }puts("");
    31     int x2;cin>>x2;
    32     if(x2<num) printf("! %d %d
    ",r,l);      //先输出0的位置
    33     else printf("! %d %d
    ",l,r);
    34 }

    2019-02-01

  • 相关阅读:
    CUDA 函数前缀与存储器前缀讨论
    VC++控制台程序中使用定时器
    C++中的RTTI
    C/C++ 时间转换与表示
    [转]winsock和winsock2冲突
    自然归并排序 c++ (原创)
    关于CC++运行时库的多线程版本的工作记录
    关于sizeof(原)
    结构体最后的长度为0或1数组的作用(转载)
    CUDA中常见的错误:the launch timed out and was treminated.
  • 原文地址:https://www.cnblogs.com/00isok/p/10346149.html
Copyright © 2011-2022 走看看