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

    题意:给定一个区间,在这个区间内找到两个数,使得他们的位或值最大。

    思路分析:我们可以从二进制的角度来思考这个问题,我们有了一个区间,那么我们最终答案的二进制的位数也就有了限制,那么我们想要做的就一定是尽可能地把这些二进制位全部变成1。由于我们一共选两个数位或取最大值,区间最大值是一定要选的,因为只有这样我们后续需要填的1才能尽可能小,落在区间内。之后就是将另一个数一位一位的拆开,再分别和答案进行计算,由于有区间的限制,我们在位或一位时先将它和左区间进行位或,看是不是小于右区间,再将该位和答案进行计算。

    代码:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<vector>
     5 using namespace std;
     6 typedef long long ll;
     7 const int N=1e6+10;
     8 int main(){
     9     int n;
    10     scanf("%d",&n);
    11     while(n--){
    12         ll a,b;
    13         scanf("%lld%lld",&a,&b);
    14         ll ans=b;//先取最大值 
    15         for(int i=0;((1ll<<i)|a)<=b;++i){//判断是否在区间内  
    16             ans|=(1ll<<i);//将该位位或 
    17         }
    18         printf("%lld
    ",ans);
    19     }
    20     return 0;
    21 } 
    View Code
  • 相关阅读:
    zabbix+grafana使用
    其它工具网址
    IntelliJ IDEA 进行多线程调试
    mac外接显示器 双屏同时滑动问题
    wacher和acl
    zookeeper介绍
    iterm2用法与技巧
    linux下ssh公钥验证的设置和远程登录
    不变模式
    单例模式创建的三种方式
  • 原文地址:https://www.cnblogs.com/li-jia-hao/p/12841978.html
Copyright © 2011-2022 走看看