• 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 ", 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
    ");
    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
    ",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
    ",a|(1<<i),b|(1<<i));//判断当前位是否相同 
    44             fflush(stdout);
    45             scanf("%d",&now); 
    46             if(now==fb) //这一位的改变不影响ab之间谁大谁小,所以是相同的 
    47             {
    48                 printf("? %d %d
    ",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
    ",a,b);
    67                 //这一位判断完毕,接着算a b在这位以后所有的是不是相同 
    68                 fflush(stdout);
    69                 scanf("%d",&fb); 
    70             }
    71         }
    72     }
    73     printf("! %d %d
    ", a, b); 
    74     fflush(stdout);
    75 }
    View Code
  • 相关阅读:
    被initramfs的一个要求搞死
    【转】网卡驱动注册到PCI总线这一过程的分析
    PCI总线
    diff和patch使用指南
    Windows 平台下构建Android 开发环境
    linux 如何使用大于2T的块设备
    PCI设备驱动 三
    CFI Flash, JEDEC Flash ,Parellel Flash, SPI Flash, Nand Flash,Nor Flash的区别和联系
    使用initramfs启动Linux成功
    glibc 各个库作用介绍
  • 原文地址:https://www.cnblogs.com/thunder-110/p/10116027.html
Copyright © 2020-2023  润新知