1. 程式人生 > >Codeforces Round #525 (Div. 2) D. Ehab and another another xor problem(互動題 異或)

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