题意:这是个交互题,题意是这样的,现在不知道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;
}