思路:
这是一道交互题。
考虑询问两个数a<b,回答是’x’当且仅当ans∈(a,b],注意是左开右闭。
然后倍增,找出一个包含ans的区间,再在这个区间上二分查询答案。
复杂度在 O ( l o g a ) O( log\ a ) O(log a)左右?
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
char opr[20];
while((~scanf("%s",opr))&&opr[0]=='s') {
int x=0,y=1;
while(true){
printf("? %d %d\n",x,y);
fflush(stdout);
char ans[20];
scanf("%s",ans);
if(ans[0]=='x') {
break;
}
x=y,y=y*2+1;
}
int mid;
int l=x,r=y;
while(l+1<r) {
mid=(l+r)>>1;
printf("? %d %d\n",l,mid);
fflush(stdout);
char ans[20];
scanf("%s",ans);
if(ans[0]=='y') l=mid;
else r=mid;
}
if(l==0) {
printf("! 1\n");
fflush(stdout);
continue;
}
printf("? %d %d\n",r,r+1);
fflush(stdout);
char ans[20];
scanf("%s",ans);
if(ans[0]=='x') r--;
printf("! %d\n",r);
fflush(stdout);
}
return 0;
}