兩道互動題
阿新 • • 發佈:2018-12-24
一直感覺互動題很有意思呀;
在 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;
}