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
  • 相关阅读:
    openjump遇到的一些问题
    kettle安装教程/安装失败
    C# string和byte[]数组之间相互转换
    C# 各种进制转换
    C#AE创建FeatureDataset/创建数据、集要素集
    ArcCatalog/arcgis怎么连接postgresql/postpis
    梦断代码阅读笔记03
    体温冲刺完成
    体温冲刺
    体温作业
  • 原文地址:https://www.cnblogs.com/li-jia-hao/p/12841978.html
Copyright © 2011-2022 走看看