zoukankan      html  css  js  c++  java
  • HDU 5969 最大的位或 【贪心】 (2016年中国大学生程序设计竞赛(合肥))

    最大的位或

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)



    Problem Description
    B君和G君聊天的时候想到了如下的问题。
    给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
    其中|表示按位或,即C、 C++、 Java中的|运算。
     
    Input
    包含至多10001组测试数据。
    第一行有一个正整数,表示数据的组数。
    接下来每一行表示一组数据,包含两个整数l,r。
    保证 0 <= l <= r <= 1018
     
    Output
    对于每组数据输出一行,表示最大的位或。
     
    Sample Input
    5 1 10 0 1 1023 1024 233 322 1000000000000000000 1000000000000000000
     
    Sample Output
    15 1 2047 511 1000000000000000000
     
    Source
     
    Recommend
    jiangzijing2015   |   We have carefully selected several similar problems for you:  5981 5980 5979 5978 5977 
     
    Statistic | Submit | Discuss | Note

    题目链接:

      http://acm.hdu.edu.cn/showproblem.php?pid=5969

    题目大意:

      给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。

    题目思路:

      【贪心】

      将l和r化为61位2进制数,取x=l,从最高位开始往下,找到第一个l和r对应位置上的数不相等的(r上为1,l上为0,因为l<=r)。

      这时只要把r这一位改成0,并把这一位后面的所有数字全改为1,作为y,即可满足l<=x<=y<=r,且从不相等的位置往后全是1使得答案最大。

     1 #include <bits/stdc++.h>
     2 #define N 104
     3 #define M 61
     4 using namespace std;
     5 typedef long long LL;
     6 int cas;
     7 LL l,r;
     8 int a[N],b[N];
     9 int main()
    10 {
    11     int i;
    12 //    freopen("1.txt","r",stdin);
    13     for(scanf("%d",&cas);cas;cas--)
    14     {
    15         scanf("%lld%lld",&l,&r);
    16         for(i=M;i>=0;i--)
    17         {
    18             LL c=1;
    19             c<<=i;
    20             if(c&l)a[i]=1;
    21             else a[i]=0;
    22             if(c&r)b[i]=1;
    23             else b[i]=0;
    24         }
    25         LL ans=0;
    26         for(i=M;i>=0;i--)
    27         {
    28             if(a[i]==b[i])
    29             {
    30                 LL c=1;
    31                 c<<=i;
    32                 ans+=c*a[i];
    33             }
    34             else break;
    35         }
    36         for(;i>=0;i--)
    37         {
    38             LL c=1;
    39             c<<=i;
    40             ans+=c;
    41         }
    42         printf("%lld
    ",ans);
    43     }
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    动画 + 设置contentoffset,然后就 蛋疼了,
    xmpp这一段蛋疼的 坑,
    项目,
    一段测试代码,哦哦哦,
    libresolv,
    mutating method sent to immutable object'
    解析json,是还是不是,
    济南学习 Day 4 T1 am
    济南学习 Day 3 T3 pm
    济南学习 Day 3 T2 pm
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/6078980.html
Copyright © 2011-2022 走看看