D - Find by Query (atcoder.jp)
题意:
有一个01串,左边都是0,右边都是1,每次提问一个位置都能回答是0还是1,最多回答20次,试确定0和1的分割线
思路:
注意到答案具有二分性,因此我们去二分这个位置
对于二分出来的每一个位置进行询问即可
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=2e5+10;
int N,k;
bool check(int x){
cout<<"? "<<x<<'\n';
cin>>k;
return k==0;
}
void solve(){
cin>>N;
int l=1,r=N,ans;
while(l<=r){
int mid=l+r>>1;
if(check(mid)){
ans=mid;
l=mid+1;
}else r=mid-1;
}
cout<<"! "<<ans<<'\n';
}
signed main(){
int __=1;//cin>>__;
while(__--)solve();return 0;
}