码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-02-01 16:26:36      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:cst   class   str   size   href   min   \n   while   sync   

<题目链接>

题目大意:

有一个长度为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\n",r,l);      //就先输出0 1的位置
34     }else {
35         printf("! %d %d\n",l,r);
36     }
37 }

 

 

2019-02-01

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

标签:cst   class   str   size   href   min   \n   while   sync   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!