题意:
0≤a,b<2^30, 最多猜62次。
交互题,题目设定好a,b的值,要你去猜。要你通过输入 c d :
如果 a^c < b^d ,会反馈 -1 ;
如果 a^c = b^d ,会反馈 0 ;
如果 a^c > b^d ,会反馈 1 ;
每次猜前面都用 ? 表示, 最后一行用!表示已经知道a b的值。
思路:
不会,然后去找别人博客学。 大致思路就是:a b都是二进制来表示,从高到低位 把a和b的每一位都判断出来。
判断a b同一位是否相等:
1. 如果相等,判断这一位是0 还是 1 ,
判断方法是:printf("? %d %d\n", a|(1<<i),b);
scanf("%d",&now); now是反馈
如果now是1,则a b 的这一位都是1(a=a|(1<<i), b=b|(1<<i) )
2. 如果不等,判断 a这一位是1 && b这一位是0 还是 a这一位是0 && b这一位是1 ,
判断方法是:见代码
步骤:
一开始通过c=0 d=0 判断a b的相对大小:
1. 如果a==b,说明a和b的所有二进制位都是相同的,按上面的1进行解决;
2. 如果a !=b,说明a b存在某些二进制位不相同的情况,所以:
首先判断当前位是否相等,如果相等,按上面1的做法 ; 如果不相等,按上面2的做法。
再判断 当前位以后的所有位 是否全都相同,如果相同,进入此1,如果不相同,进入此2.
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const ll mod=1e9+7; 20 const int INF= 0x3f3f3f3f; 21 const int N=1e5; 22 23 24 int main() 25 { 26 int a=0,b=0,fb,now; 27 printf("? 0 0\n"); 28 fflush(stdout); 29 scanf("%d",&fb); 30 31 for(int i=29;i>=0;i--) 32 { 33 if(fb==0)//a b 在当前i位以后的 所有都相同 34 { 35 printf("? %d %d\n",a|(1<<i),b); 36 fflush(stdout); 37 scanf("%d",&now); //判断当前这位是1还是0 38 if(now==-1) //是1 39 a=a|(1<<i), b=b|(1<<i); 40 } 41 else//a b 在当前i位以后的各位 存在不同 42 { 43 printf("? %d %d\n",a|(1<<i),b|(1<<i));//判断当前位是否相同 44 fflush(stdout); 45 scanf("%d",&now); 46 if(now==fb) //这一位的改变不影响ab之间谁大谁小,所以是相同的 47 { 48 printf("? %d %d\n",a|(1<<i),b); 49 fflush(stdout); 50 scanf("%d",&now); //判断这位是1还是0 51 if(now==-1) //是1 52 a=a|(1<<i), b=b|(1<<i); 53 } 54 else // a中的这一位和b中的这一位 不相同 55 { 56 //假设答案a为101,b为001,代码中a=0,b=0, 57 //所以a|(1<<2)=100,b|(1<<2)=100, 101^100=001,001^100=101, 58 //此时now==-1,说明a这位为1,b这位为0; 59 60 //如果答案b为101,a为001,代码中a=0,b=0, 61 //所以a|(1<<2)=100,b|(1<<2)=100,001^100=101,101^100=001, 62 //此时now==1,说明a这位为0,b这位为1; 63 if (now==-1) a |= 1 << i; 64 else if(now==1) b |= 1 << i; //因为now不可能=0了 65 66 printf("? %d %d\n",a,b); 67 //这一位判断完毕,接着算a b在这位以后所有的是不是相同 68 fflush(stdout); 69 scanf("%d",&fb); 70 } 71 } 72 } 73 printf("! %d %d\n", a, b); 74 fflush(stdout); 75 }