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

题目链接:Mahmoud and Ehab and the binary string

题意:

  一道交互题,首先给出一个字符串的长度l。现在让你进行提问(最多15次),每次提问提出一个字符串,会返回这个字符串与目标串之间不同的字符的个数。要在15次的提问内,找到目标串中任意一个1和0的位置。

题解:

  因为是15次提问,其实可以想到二分,但是分别对0和1进行二分差不多要二十多次,所以可以对01或10进行二分,查找某一个01或10串的位置。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX_N = 1e5+9;
 4 int vec[MAX_N];
 5 int main()
 6 {
 7     int N,M,T;
 8     cin>>N;
 9     printf("?\n");
10     for(int i=1;i<=N;i++) printf("0");
11     cout<<endl;
12     int num;
13     cin>>num;
14     int l = 1,r = N,x;
15     while(r-l>=2)
16     {
17         int mid = (l+r)/2;
18         printf("?\n");
19         for(int i=1;i<=N;i++)
20         {
21             if(i>=l && i<=mid) printf("1");
22             else printf("0");
23         }
24         cout<<endl;
25         cin>>x;
26         if(abs(num - x) == mid - l + 1) l = mid;
27         else r = mid;
28     }
29     int x1,x2;
30     printf("?\n");
31     for(int i=1;i<=N;i++)
32     {
33         if(i == l) printf("1");
34         else printf("0");
35     }
36     cout<<endl;
37     cin>>x1;
38     if(x1<num)
39     {
40         printf("! %d %d\n",r,l);
41     }
42     else printf("! %d %d\n",l,r);
43     return 0;
44 }

 

posted @ 2018-03-13 17:15  会打架的程序员不是好客服  阅读(220)  评论(0编辑  收藏  举报