1. 程式人生 > >兩道互動題

兩道互動題

一直感覺互動題很有意思呀;

在 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; }