zoukankan      html  css  js  c++  java
  • HDU5969 最大的位或

    整活

    才发现自己又把位运算给忘了,完蛋玩意儿...

    | 运算是两个位都为1才为1,其余都是0。

    所以预处理一个包含maxn位的二进制数。从上向下取就完了,如果一个数是2^n^,那么与他 | 最大的肯定是2^n-1^,如果取不到那么肯定是往上取。然后看代码就行了...

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int maxn 70
    #define ll long long
    ll bits[maxn];
    int main(){
        //初始化位数组
        bits[0]=1;
        for(int i=1;i<maxn;i++)//预处理所有2的n次方
            bits[i]=bits[i-1]*2;
        int n;
        while(~scanf("%d", &n)){
            while(n--){
                ll l, r, ans, now;
                scanf("%lld%lld", &l,&r);
                ans=l;
                now=0;
                for(int i=maxn-1;i>=0;i--){//从高位向低位枚举
                    if((r&bits[i])!=0){
                        now+=bits[i];//这个向上取个人感觉挺不好理解
                        if(now-1>=l)	
                            ans=max(ans,(now|now-1));
                    }
                }
                printf("%lld
    ", ans);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    4.12作业
    4.9上机作业
    第十周上级作业
    第九周上机作业
    第八周作业
    第八周上机作业
    第七周作业
    第七周上机练习
    第六周作业
    4.9上机练习
  • 原文地址:https://www.cnblogs.com/Zfio/p/12843624.html
Copyright © 2011-2022 走看看