CF1039B
题解:
-
第二次做交互题,对交互题没什么感觉。你要询问系统,所以你cout输入,系统再立刻给你cin答案。交互题格式就在于要清空缓存区,可以在printf输出完之后,加一fflush(stdout);也可以直接使用cout<<endl来输出,endl不仅是换行,还可以直接清空缓存区。
-
二分询问区间,当火车在[1,n]区间,你询问[l-k,mid+k],因为设备有延迟作用。如果返回Yes,则范围缩小。否则询问另一边
-
因为区间长度适中大于等于2k,所以当小到一定程度就随机问吧!玄学orz!我选择的区间范围为4k。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
string s;
int main(){
cin>>n>>k;
srand(time(0));
ll l = 1, r = n;
while(1){
if(r - l <= 4*k){ //随机猜测
ll ans = rand() % (r - l + 1) + l;
cout<<ans<<" "<<ans<<endl;
cin>>s;
if(s[0] == 'Y' || s[0] == 'B') return 0;
else{
l = max(1ll,l-*k);
r = min(n,r+*k); //加2*k是因为上一次询问移动了k,但是每有查到结果,所以下一次的得到结果又移动了k。
}
}else{
ll mid = (l + r) >> 1; //[l,mid];
cout<<l<<" "<<mid<<endl;
cin>>s;
if(s[0] == 'B') return 0;
if(s[0] == 'Y'){ //在[l-k,mid+k]
l = max(1ll,l-k);
r = min(n,mid+k);
}else{ //[mid+1-k,r+k];
l = max(1ll,mid+1-k);
r = min(n,r+k);
}
}
}
return 0;
}