题目:
题意解析:
题解:
第一次看见这个题目是很懵逼的,因为没有输入输出模拟。在最后给出的表格案例中,得出题目是这样,题目给你一个n,有一个长度为n的数字串,数字串由01(0数字在整体在数字串的前面,1数字整体值数字串的后面)组成,要你找到01数字分界的下标。
输出是
- ? i:你要查询的下标 i 的数组的值。
- !i:是你最后得出的分界下标的答案。
题意理解之后,这个题目就很简单了,使用二分法求解,时间复杂度为logn.
代码:
#include<bits/stdc++.h>
using namespace std;
int l,r;
bool ask(int k){
int t;
cout<<'?'<<' '<<k<<endl;
cin>>t;
return t==0;
}
int main() {
cin>>r;
int mid,ans;
l=1;
while(l<=r){
mid=(r+l)/2;
if(ask(mid)){
ans=mid;
l=mid+1;
}else{
r=mid-1;
}
}
cout<<'!'<<' '<<ans;
return 0;
}