题目链接: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 }