Codeforces 862D. Mahmoud and Ehab and the binary string 二分(交互题)

Posted 00isok

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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){      //如果原串的位置是10的话
33         printf("! %d %d
",r,l);      //就先输出0 1的位置
34     }else {
35         printf("! %d %d
",l,r);
36     }
37 }

 

 

2019-02-01

以上是关于Codeforces 862D. Mahmoud and Ehab and the binary string 二分(交互题)的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 862C. Mahmoud and Ehab and the xor

Codeforces 862B - Mahmoud and Ehab and the bipartiteness

Codeforces 862C - Mahmoud and Ehab and the xor

E - Mahmoud and Ehab and the bipartiteness CodeForces - 862B (dfs黑白染色)

codeforces 862B B. Mahmoud and Ehab and the bipartiteness

CodeForces 862E Mahmoud and Ehab and the function 暴力,二分