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

题目

题意:

  0a,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.

  

 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 }
View Code

猜你喜欢

转载自www.cnblogs.com/thunder-110/p/10116027.html