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

原文地址:https://www.cnblogs.com/00isok/p/10346149.html