HDU—5969最大位或

来源:互联网 发布:r语言编辑器 知乎 编辑:程序博客网 时间:2024/06/15 01:37

最大的位或

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1829    Accepted Submission(s): 689


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
51 100 11023 1024233 3221000000000000000000 1000000000000000000
 

Sample Output
15120475111000000000000000000

转化二进制  从后往前(从前往后也可以)遍历小数的每一位,碰到0就变成1,找到不大于大数 的最大数  然后异或。

代码写的啰嗦了些。。。。

#include<stdio.h>#define N 100long long p[N];long long s1[N],s2[N];long long a,b,l1,l2;void init(){    p[0]=1;    int i;    for(i=1;i<=70;i++)    {        p[i]=p[i-1]*2;    }}bool judge(){    int i;    long long num=0;    for(i=0;i<l1;i++)    {        if(s1[i]==1)            num+=p[i];    }    if(num>b)        return true;    else        return false;}int main(){    int n;    init();    scanf("%d",&n);    while(n--)    {        long long k,t,i;        scanf("%lld %lld",&a,&b);        k=0;        t=a;        while(1)        {            if(t/2==0)            {                s1[k++]=t;                l1=k;                break;            }            long long c=t%2;            s1[k++]=c;            t=t/2;        }        k=0;        t=b;        while(1)        {            if(t/2==0)            {                s2[k++]=t;                l2=k;                break;            }            long long c=t%2;            s2[k++]=c;            t=t/2;        }        for(i=0;i<l2;i++)        {            if(s1[i]==0&&s2[i]==0)            {                s1[i]=1;                if(judge())                {                    s1[i]=0;                    break;                }            }        }        for(i=0;i<l2;i++)        {            if(s1[i]==1)                s2[i]=1;        }        long long ans=0;        for(i=0;i<l2;i++)        {            if(s2[i]==1||s1[i]==1)                ans+=p[i];        }        printf("%lld\n",ans);    }}

原创粉丝点击