D. Ehab and another another xor problem(Codeforces Round #525 (Div. 2))(交互题)

传送门

题意:这是个交互题,题意是这样的,现在不知道a,b的值,但是有三种操作,

然后每次问完问题,也就是你输出你的c和d,交互系统会给出相应的值(1/0/-1),然后你最多可以问62个问题,最后确定出这个a和b是多少?数据范围:

题解:要想确定a和b的值,况且a,b的范围最多是30位,如果可以分别确定每一位上的值,那么a,b也就确定了,但是根据三种操作只能确定大小关系,那么又该如何做呢?那么一位一位比较,从低位到高位还是从高位到低位,还是从高位到低位吧,设此时已经比较到了第i位,那么此时a,b的第i位无非有四种情况{0,0},{1,1},{1,0},{0,1},先将a,b初始化0,0,然后可以分别问这样两个问题(a^(1<<i),b),(a,(b^(1<<i)),如果是第一种情况,自然两个问题问了后,回答是不一样的,况且必然第一个回复是1,所以此时接着比较下一位即可,对于第二种情况是,两个回答肯定是不一样的,况且第一个答复是-1,所以直接将a,b进行^(1<<i),表示加上这个位子上的1,然后对于后面两种情况,两者的回答必然是相同的,然后当然首先要问下(0,0)的回复,如果答复是1,必然a要^(1<<i),否则b^(1<<i),然后将第一个回复记录下,为什么,因为它实际上记录的是从这一位开始后面的比较。

注意:

传送门可以看这篇博文了解下fflush(stdout)的作用吧

附上代码:


#include<bits/stdc++.h>

using namespace std;

int ask(int c,int d)
{
    printf("? %d %d\n",c,d);
    fflush(stdout);
    int ans;
    scanf("%d",&ans);
    return ans;
}

int main()
{
    int a=0,b=0,big=ask(0,0);
    for(int i=29;i>=0;i--){
        int f=ask(a^(1<<i),b),s=ask(a,b^(1<<i));
        if(f==s){
            if(big==1){
                a^=(1<<i);
            }else{
                b^=(1<<i);
            }
            big=f;
        }else if(f==-1){
            a^=(1<<i);
            b^=(1<<i);
        }
    }
    printf("! %d %d\n",a,b);
    fflush(stdout);
    return 0;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值