http://codeforces.com/contest/810/problem/D
一直感觉交互题很有意思呀;
在 1…..n 中选了k个数字
我们猜 x y
机器选择最接近x的数a 和最接近y的数 b
如果 |x-a| <= |y-b| 机器输出 TAK 否则NIE
只需要猜出两个数字 即可
最多问60次
一直没想到怎么二分,看到了一个正确性很高的二分。。。
那么我们 将 1-n 分成(1,mid) (mid+1,n)
要猜的数肯定在这两个区间中
我们用mid和mid+1来判断
|mid-a| <= | mid+1-b | ,那么我们知道更接近mid,或者 ==,
无论哪种结果我们可知 [1,mid]中肯定存在解
|mid-a| > |mid+1-b| ,那么我们知道更接近mid+1,那么我们知道[mid+1,n]中肯定有解
#define ll __int64
int n , k;
bool check(int x , int y) {
if(x < 0 || y > n) return false;
string res;
printf("1 %d %d\n",x,y);
fflush(stdout);
cin >> res;
return res == "TAK"; //<=
}
int getnum(int l , int r) {
if(l > r) return -1;
int mid = (l + r) >> 1;
while(l < r) {
mid = (l + r) >> 1;
if(check(mid , mid + 1))
r = mid;
else
l = mid + 1;
}
return l;
}
int main() {
scanf("%d %d",&n,&k);
int x , y;
x = getnum(1 , n); // 先找到一个x
y = getnum(1 , x - 1); // (1,x)
if(!check(y , x))
y = getnum(x + 1 , n); //(x+1,n);
printf("2 %d %d\n",x,y);
return 0;
}