两道交互题

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

你可能感兴趣的:(两道交互题)