CF - 484 - A. Bits(构造)

本文详细解析了如何通过算法解决Codeforces平台上的484A题目,涉及二进制数的比较与操作,以及如何在不同长度的二进制数之间进行最优选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:n(1 ≤ n ≤ 10000) 组数据,每组一个l, r(0 ≤ li ≤ ri ≤ 10^18),求[l, r]间二进制表示1最多的,最小的数。

题目链接:http://codeforces.com/problemset/problem/484/A

——>>如果 l 与 r 的二进制位数不一样,那么此时应达全1状态近 r。。

如果 l 与 r 的进制数位数一样的时候,从较小数不断加各个位置的 1 ,不超过 r 得到的数就是结果。。

1LL.。。。。。。。

#include <cstdio>

int Cal(long long x)
{
    int ret = 0;

    while (x)
    {
        ++ret;
        x >>= 1;
    }

    return ret;
}

int main()
{
    int n;
    long long l, r, ret;

    scanf("%d", &n);
    while (n--)
    {
        scanf("%I64d%I64d", &l, &r);

        int lcnt = Cal(l);
        int rcnt = Cal(r);

        if (lcnt < rcnt)
        {
            if (r == (1LL << rcnt) - 1)
            {
                ret = r;
            }
            else
            {
                ret = (1LL << (rcnt - 1)) - 1;
            }
        }
        else
        {
            for (int i = 0; i < rcnt; ++i)
            {
                if (((1LL << i) | l) <= r)
                {
                    l |= (1LL << i);
                }
            }
            ret = l;
        }

        printf("%I64d\n", ret);
    }

    return 0;
}


#include"IRremote.h" int RECV_PIN = 11; //红外线接收器OUTPUT端接在pin 11 IRrecv irrecv(RECV_PIN); // 定义IRrecv 对象来接收红外线信号 decode_results results; //解码结果放在decode_results构造的对象results里 void irdisplay(unsigned long value) // 按下按键后,显示本人遥控对应的按键 { switch(value){ //判定按下的是哪个按键 case 0xFFA25D:Serial.println("CH-");break; case 0xFF629D:Serial.println("CH");break; case 0xFFE21D:Serial.println("CH+");break; case 0xFF22DD:Serial.println("PREV");break; case 0xFF02FD:Serial.println("NEXT");break; case 0XFFC23D: Serial.println("PLAY/PAUSE");break; case 0xFFE01F:Serial.println("-");break; case 0xFFA857:Serial.println("+");break; case 0xFF906F:Serial.println("EQ");break; case 0xFF6897:Serial.println("0");break; case 0xFF9867:Serial.println("100+");break; case 0xFFB04F:Serial.println("200+");break; case 0xFF30CF:Serial.println("1");break; case 0xFF18E7:Serial.println("2");break; case 0xFF7A85:Serial.println("3");break; case 0xFF10EF:Serial.println("4");break; case 0xFF38C7:Serial.println("5");break; case 0xFF5AA5:Serial.println("6");break; case 0xFF42BD:Serial.println("7");break; case 0xFF4AB5:Serial.println("8");break; case 0xFF52AD:Serial.println("9");break; } } void setup() { Serial.begin(9600); irrecv.enableIRIn(); //启动红外解码 } void loop() { if (irrecv.decode(&results)) { //解码成功,收到一组红外线信号 //if(results.value != (-1)){ Serial.print("irCode:"); Serial.print(results.value,HEX); //输出红外线解码结果(十六进制) //results.value 是unsigned long型,头文件有介绍 Serial.print(", bits: "); Serial.println(results.bits);} // 红外线码元位数 irdisplay(results.value); irrecv.resume(); } //}修正此代码
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值