[ 9.22 ]CF每日一题系列—— 484A Bits

Description:
  给你一个l,r的区间让你找一个最小的x并且其二进制数要包含最多的1位,输出它的十进制

Solution:
  我本来就是贪心,但是贪大了,想1一直往上添加1,但是忘记了0在中间的情况,考虑好了之后,发现这样贪是错误的,因为越往后位数越大,所以你最后的结果只能是1,11,111,1111,11111,而不可能是10,100,1001,10010,所以应该从后往前贪,这也是我们十进制转二进制的人工算法吧算是,十进制转二进制,手算的时候,就是一步一步确定最高位的1在哪里,

code

  从满1开始用异或变0,如果变成了0小于l,这是不允许的,第一个满足条件的就是最好的,可能你有疑惑,不是要最小的x吗,你想想110,和101,区间假如就是[5,6]从111开始第一位不能变成0,第二位可以101就结束了,所以从后往前变零就是从最小满足到最大满足的考虑了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long int ll;

int main()
{
    ll num;
    ll l,r;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        num = (1LL << 62) - 1;
        scanf("%lld%lld",&l,&r);
        for(int i = 61;i >= 0;i--)
        {
            //即时退出保证1是最多的
            if(num >= l && num <= r)
                break;
            if((num ^ (1LL << i)) >= l)
                num ^= (1LL << i);
        }
        printf("%lld\n",num);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/DF-yimeng/p/9689456.html

时间: 2024-10-08 02:57:26

[ 9.22 ]CF每日一题系列—— 484A Bits的相关文章

CF每日一题系列 —— 415A

http://codeforces.com/problemset/page/7?order=BY_SOLVED_DESC 从5000以内选的,emmm还是比较水的哈 时间还是有的,所以万事万物贵在坚持,希望能坚持下去! Describe: 1 - n个灯线性排列(初始为开),小明可以选择开关 op,这回把op - n 的灯全部关闭,如果(是关着的状态没有影响) 给你小明选择op的操作顺序,输出顺序输出每个灯是由哪个op操作关了的 Solution: 跑暴力就好了,我用了一个比较水的优化,记录当前

[ 9.11 ]CF每日一题系列—— 441C暴力模拟

Description: n * m 的地图,建设k个管道管道只能横竖走,且长度大于等于2,问你任意一种建设方法 Solution: 图里没有障碍,所以先把前k - 1个管道每个分2个长度,最后一个管道一连到底 Code: PS:今天时间没来的急,其实函数可以封装一下的,虽然都是暴力,但也得暴力的优美不是?? #include <iostream> #include <cstdio> using namespace std; int main() { int n,m,k; whil

[ 9.12 ]CF每日一题系列—— 960B暴力数组

Description: 给你两个数组,顺序一定,问你第一个数组连续的几个值等于下一个数组连续的几个值,然后寻找这个值得最大值,也就是满足就换 Solution: 用两个变量索引,判断即可 #include <iostream> #include <cstdio> using namespace std; const int maxn = 1e6 + 1e3; int a[maxn],b[maxn]; int main() { int n,m; while(~scanf("

[ 9.26 ]CF每日一题系列—— 771B递推问题

Description: 给定你命名的规律,1-10个字符,开头必须大写,最多有50个名字,然后告诉你有n个人,判断区间长度为k,那么你将得到n - k + 1个答案(YES or NO) 表示1 - k,2 -k+1,n - K + 1-- n这些人里面是否没有重名,YES没有,NO有,让你推出一种名字的组合方式 Solution: 首先先跑出一个名字数组,这个题目要往后看,所以应该是从后往前推n - k + 2 到 n的名字没有要求,所以我们命名各不相同,从n - k + 1开始,如果是YE

[ 10.03 ]CF每日一题系列—— 534B贪心

Descripe: 贪心,贪在哪里呢-- 给你初始速度,结尾速度,行驶秒数,每秒速度可变化的范围,问你行驶秒数内最远可以行驶多少距离 Solution: 贪心,我是否加速,就是看剩下的时间能不能减到原始给定的结尾速度 #include <iostream> using namespace std; int main() { int v1,v2; int t,d; while(cin>>v1>>v2) { cin>>t>>d; int ret =

[ 10.4 ]CF每日一题系列—— 486C

Description: 给你一个指针,可以左右移动,指向的小写字母可以,改变,但都是有花费的a - b 和 a - z花费1,指针移动也要花费,一个单位花费1,问你把当前字符串变成回文串的最小化费是多少 Solution: 真是贪啊,也怪我没咋理解题意~~ 首先对于字母的调整肯定是有一个最优值得,无法改变的,能改变的就是我们是改变左区间的还是右边的呢? 我们可以记录改变字母的最大区间长度(一半的区间),我们从0遍历到中间,得到左区间的范围,如过p在左区间就用这个范围,否则用右区间的范围,所以不

[ 10.08 ]CF每日一题系列—— 602B

Description: 一个数组,保证相邻两个元素值得差小于1,问题,最大值和最小值的差 < 1的区间长度最长是多少 Solution: 还是卡了一下,本来以为是模拟就好了,但是卡时间,想来想去最后还是忽略了一个地方,就是它的保证,相邻元素值得差小于1,就保证了这个序列得变化是以1或0为单位相邻变化的,所以不可能出现5 4 6,所以我们考虑一个数字x的时候只要去找出现的位置就好,我们要找的可能区间有x 和 x + 1区间或者x 和 x - 1区间,所以我们看一下上一个x - 1 出现的位置和x

老男孩教育每日一题-2017年5月22日-命令风暴:变量a=’a/b/c’如何截取得到c

1.题目 2.参考答案 系统环境 [[email protected] ~]# uname -r2.6.32-504.el6.x86_64 [[email protected] ~]# cat /etc/redhat-releaseCentOS release 6.6 (Final) [[email protected] ~]# a='a/b/c' 方法1-cut [[email protected] ~]# echo $a | cut -c5c 方法2-tr替换 [[email protect

老男孩教育每日一题-2017年5月17日-使用三剑客进行变化格式

1.题目 原始数据: 17/Apr/2015:09:29:24 +0800 17/Apr/2015:09:30:26 +0800 17/Apr/2015:09:31:56 +0800 18/Apr/2015:09:34:12 +0800 18/Apr/2015:09:35:23 +0800 19/Apr/2015:09:23:34 +0800 19/Apr/2015:09:22:21 +0800 20/Apr/2015:09:45:22 +0800 期望结果: 2015-04-17 09:29: