• NYOJ-744蚂蚁的难题(一)


    这个题都说是水题,楞是没做出来,看了好多题解,感觉这个规律没看懂,后来在讨论区看到了一个题解,感觉有点懂了,写一下自己的理解

    首先要明白异或的意思,简单一句话: 同0异1,既然这样,让求区间a,b 中异或最大的一个,那么最大的一组是多少呢,多谢几组数据,先求出来 a ^ b的值,因为这是求最大的基础,令x=a^b,那么x二进制第一个1应该出现在b为1,并且a为0, 因为b > a, 这个可以动手实验一下,那么由于任意取的两个数是位于a和b之间的,所以,这任意两个数的二进制位数一定是小于等于x二进制位数的,因为他是个区间,所以一定可以找到使得x的二进制的第一个1之后的各位全为1,那么这个最大值,这时候也就变成了x的二进制位数全为1的值,令n = x的二进制位数,结果就是2^n-1,举个例子,5 和 7, 那么5的二进制为101, 7的二进制为111,5^7=010,第一个1出现在第二位,那么1右边的那个0一定可以变化着两个数的值得到,即最大值去5,6,所以异或之后为3,二进制即为11,所以也就是2^2-1 = 3;

    代码如下:

     1  
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     
     9     long long a, b;
    10     while (~scanf("%lld %lld", &a, &b))
    11     {
    12     
    13         long long x = a ^ b;
    14         int c = 0;
    15         while (x)
    16         {
    17             c++;
    18             x >>= 1;
    19         }
    20         long long res = 1;
    21         for (int i = 0; i < c; i++)
    22         {
    23             res *= 2;
    24         }
    25         printf("%lld
    ", res - 1);
    26     }
    27     return 0;
    28 }        
  • 相关阅读:
    STL 全排列
    Happy Programming Contest
    输入外挂
    Crazy Professor
    订票助手 12306
    我的e证空间 出入境证照可在家自拍啦!
    雨生红球藻 虾青素 寻找正规产品!
    CAR 汽车团购网站—广州
    3G路由器、无线接入点(无线AP)、无线路由器!
    微软 Lightswitch 发布 V2 Beta,引入新的逻辑层基础技术!
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/4175805.html
Copyright © 2020-2023  润新知