cf1088D Ehab and another another xor problem(思维)

交互题

     题目讲的是,有两个数(a,b)让猜,每次询问只能问(c,d)如果a^c < b^d 返回-1,如果a^c > b^d 返回1 ,相等返回0

62次以内问出来。

     这个肯定是要按位处理,从高到低,那么a,b的这一位的组合也就四种(0,0)(0,1)(1,0)(1,1),我们想要确认出来,从下表可以看出,可以询问c,d这一位分别为(0,1)或者(1,0)各一次,如果结果不一样就可以确定这一位,但是如果是一样但是是不确定的的话,那么也就是说,两个其中一个这一位一定是1,可是怎么判断谁是1呢,这就要从两个数字的大小来判断。

       我们可以询问一下(0,0)确定了两个数字的大小关系,然后碰到了两者必须填一个1的情况,就给大的那个数填一个1,然后把两个都假设成1,更新一下两个后半截的大小关系。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MAXN = 1e5+5;
ll r;
int main()
{
    ll a=0,b=0;
    ll c = 0,d = 0,qa=0,qb=0;
    ll k = 1;

    printf("? %lld %lld\n",a,b);
    fflush(stdout);
    scanf("%lld",&r);

    if(r == -1)k = 0;
    for(ll i=29;i>=0;i--){
        ll qa = (a ^ (1<<i));

        printf("? %lld %lld\n",qa,b);
        fflush(stdout);
        scanf("%lld",&r);

        ll k1 = r;
        ll qb = (b ^ (1<<i));

        printf("? %lld %lld\n",a,qb);
        fflush(stdout);
        scanf("%lld",&r);

        ll k2 = r;
        if(k1 == -1 && k2 == 1)
            a = a^(1<<i),b = b^(1<<i);
        if( k1 == k2 ){
            if(k)a = a^(1<<i);
            else b = b^(1<<i);
            if(k1 == 1)k = 1;
            else k = 0;
        }
    }
    printf("! %lld %lld\n",a,b);
    fflush(stdout);
}

猜你喜欢

转载自blog.csdn.net/qq_41645482/article/details/104284042