美文网首页
B - And Or UVA - 12898

B - And Or UVA - 12898

作者: 陌路晨曦 | 来源:发表于2017-04-21 00:37 被阅读0次

这道题贼有意思,是一个二进制的题,当时比赛的时候模模糊糊的有点思路,但是想错了,最后还是粗事情了,我开始的想法不是很清晰,试图打表解决。画个图来表达我的想法吧。
我一开始的想法是一个猜测。
当两个数的差大到一定程度的时候那么它们的&运算的结果肯定是0,|运算的结果肯定是111111111(1的个数为两个数中二进制位数较大的位数);
当然这个猜测的大概方向,可能是靠谱的吧
问题是我没能条理清晰的分析这个猜想
没能深入去推敲这个东东,不然可能当时就做出来了
可能是当时脑子有点懵逼吧
两者单纯的数量差不是关键,关键是两个数的二进制位数差


无标题.png

我自己画的图,挺丑的,但是大概表达了意思,我将从A->B过程中A,B的会进行01交替变化的区域称为活动区,即为图中褐色笔圈出来的部分。活动区的变化结果符合我上面的猜想,|的计算结果每一位都为1,&的计算结果每一位都为0。
那么当A<B时,整个B长度内的区域都为活动区,那么计算结果就是|为lenb长度个1,&为0;
当A==B时活动区为从高位到低位第一个A和B不相同的数字后的区域,那么计算结果也就是|为B在这一位之后的位数全部换为1;&为这一位过后的位数全部换为0;
那么这时候直接再将二进制转换为十进制便是结果:
我的代码如下,我是直接将十进制数字转换为二进制进行操作的,操作完再转回十进制;
当然肯定还有更加巧妙的做法;
但肯定差不多也是基于这个思路和特性;
我的代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
typedef long long LL;
int a[63],b[63];
const LL one = 1;

int change(LL x,int *a)
{
    int cnt = 0;
    while(x)
    {
        a[cnt] = x&1;
        x >>= 1;
        cnt++;
    }
    return cnt;
}
int main()
{
    int t;
    scanf("%d",&t);
    int cas = 1;
    while(t--)
    {
        
        LL x,y;
        scanf("%lld%lld",&x,&y);
        int xx = change(x,a);
        int yy = change(y,b);
        if(yy>xx)
        {
            LL t = (one << yy) - 1;
            LL Or = t;
            LL And = 0;
            printf("Case %d: %lld %lld\n",cas++,Or,And);
            continue;
        }
        if(xx == yy)
        {
            int i; 
            for(i = yy-1;i>=0;i--)
            {
                if(a[i]!=b[i])
                {
                    break;
                }
            }
            LL t = (one << (i+1)) - 1;
            LL Or = y|t;
            LL And = y&~t;
            printf("Case %d: %lld %lld\n",cas++,Or,And);
            continue;
        }
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
    }
}

相关文章

  • B - And Or UVA - 12898

    这道题贼有意思,是一个二进制的题,当时比赛的时候模模糊糊的有点思路,但是想错了,最后还是粗事情了,我开始的想法不是...

  • 有趣的数学题

    UVA12716 UVA11582 UVA12716 GCD XOR 题解 参考这题用到2个结论a ^ b = c...

  • 素数练习题

    UVA 10375 UVA 10791 UVA10375 Choose and divide 题解 先素数打表,然...

  • UVA10763(Foreign Exchange )

    UVA10763传送门题目大意:参照紫书,题目给出多行两个数字A,B然后一个(A,B)需要和一个(B,A)对应,若...

  • 字典树

    UVA 11488题目链接https://uva.onlinejudge.org/index.php?option...

  • ACM 国内外几个网站 & 题目分类

    国外 西班牙Valladolid大学 Uva:https://uva.onlinejudge.org俄罗斯Ural...

  • 皮肤科学小知识:

    对皮肤造成损伤的紫外线主要是UVB和UVA。 UVA能穿透玻璃对皮肤的穿透能力也比较强,可以深达真皮,UVA的生物...

  • ACM刷题打卡-151215

    UVa 272 - TEX Quotes 水题。字符替换。 UVa 10082 - WERTYU 第一次提交WA,...

  • 美肤mini课堂之防晒的理论知识

    1、关于UVA和UVB UVB是波短的紫外线,威力次于UVA,只能晒到表皮层,能把皮肤晒红、晒伤;UVA是波长的紫...

  • 2020-08-22

    达到精准美白的目的,防UVA更重要,之前一直有说法,UVA与老化的关系更直接。毕竟UVA的辐射量是UVB的近50倍...

网友评论

      本文标题:B - And Or UVA - 12898

      本文链接:https://www.haomeiwen.com/subject/wwsrzttx.html