Codeforces 484A Bits(贪心)

题目链接:Codeforces 484A Bits

题目大意:给定区间l,r,找到一个数x,保证x在区间上,并且要求x的bitcount尽量大的前提下数值尽量小。

解题思路:默认x为全1的二进制数,每次从最高为判断,看最高位的1变为0后大于r,就将该为变成0;落在区间上则即

为要照的答案;小于l则表示该为不能为0.

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
typedef long long ll;
ll l, r;

int main () {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%lld%lld", &l, &r);
        ll ans = (1LL<<62)-1;

        for (int i = 61; i >= 0; i--) {
            if (r >= ans && ans >= l)
                break;
            if ((ans^(1LL<<i)) < l)
                continue;
            ans ^= (1LL<<i);
        }
        printf("%lld\n", ans);
    }
    return 0;
}
时间: 2024-10-16 18:32:10

Codeforces 484A Bits(贪心)的相关文章

CodeForces 484A Bits

题意: 10000个询问  每个询问输入L和R(10^18)  输出在区间内二进制表示下1最多的数字  如果1个数相同输出最小的 思路: YY一下  觉得后几位全是1的时候能保证1的个数多  那么如何构造出这个数字呢?? 将L和R都变成二进制  从高位到低位  L和R相同的那几位一定是不变的  因为要保证构造出的数字在区间内  然后分两种情况 一是L和R一直相同  那就没什么好说的了  就是它了 二是发现了有一位不同  这时R的那个位一定是1  L的一定是0  那么只要把R的那个1变成0  然后

Codeforces 484A - Bits 二进制找1

这题可以根据l, r 在二进制下的长度进行分类. l  的长度小于 r 的时候,有两种可能,一种是r 在二进制下是 1* 这种样子,故答案取 r : 一种是取答案为  (1LL << (rcnt - 1)) - 1 ,意思为比 r 小一位长度,也是 1* 这种样子的数. l 的长度等于 r 的时候,答案从 l 开始找 , 按位 与 1,同时要满足答案不大于 r  即可. source code (有参考): //#pragma comment(linker, "/STACK:1677

Codeforces 413C Jeopardy!(贪心)

题目链接:Codeforces 413C Jeopardy! 题目大意:给出n个关卡,每个关卡闯关成功会得到相应的分数,有m个关卡闯关成功之后,可以选择不加上该关卡的分,而是将已有的分数翻倍,现在有一位选手已经有能力闯过所有的关卡,问说他能得到的最大分数是多少. 解题思路:贪心,将可以翻倍的关卡放在后面比,不能翻倍的关卡放在前面比,然后在按照关卡分数大的先比,如果该关卡分数可以翻倍,就判断是当前关卡的分数高还是已有的分数高. #include <cstdio> #include <cst

Codeforces Round #276 (Div. 1) A. Bits 贪心

A. Bits Let's denote as  the number of bits set ('1' bits) in the binary representation of the non-negative integer x. You are given multiple queries consisting of pairs of integers l and r. For each query, find the x, such that l ≤ x ≤ r, and is max

Codeforces 1208F Bits And Pieces 位运算 + 贪心 + dp

题意:给你一个序列a, 问a[i] ^ (a[j] & a[k])的最大值,其中i < j < k. 思路:我们考虑对于每个a[i]求出它的最优解.因为是异或运算,所以我们从高位向低位枚举,如果这一位a[i]是0,我们就在a[i]的右边找两个位置让它们按位与起来这位是1.那么,我们贪心的保留可以通过按位与凑出某个二进制数的最靠右的两个位置.这个可以通过dp的方式预处理出来.之后,我们枚举每一个数a[i],先找出它的哪些位是0,之后从高位到低位枚举,判断这一位是否可以变成1.如果之前已经

Codeforces 452D [模拟][贪心]

题意: 给你k件衣服处理,告诉你洗衣机烘干机折叠机的数量,和它们处理一件衣服的时间,要求一件衣服在洗完之后必须立刻烘干,烘干之后必须立刻折叠,问所需的最小时间. 思路: 1.按照时间模拟 2.若洗完的衣服或者烘干的衣服较多来不及进行下一个步骤,则从一开始就顺延洗衣服的时间,贪心的思想也是体现在这里. 3.关键在于烘干衣服的顺延如何处理,因为需要调整洗衣服的起始时间,其实我们只要对烘干衣服的时间进行顺延处理就可以了,因为即使没有调整洗衣服的起始时间,那么下次到了烘干衣服的时间的时候因为烘干衣服的数

Codeforces 534D Handshakes(贪心)

题意   房子里有n个人走进来  编号1~n  每个人走进来时房子里所有空闲的人都会和他招手  空闲的某三个人可以选择一起去打比赛  当然打比赛就变得不空闲了  给你每个人进来时和他招手的人的数量  要求输出一种可能的进房间顺序 没有可能的就输出Impossible 这题放在d就比较简单了  直接贪心就可以  把招手数量为i对应的人都保存到栈s[i]里  第一个进房间的人肯定是s[0]里的  然后让i从0开始  s[i]非空时  让s[i]的栈顶的人进入房间  然后i++  否则让s[i-1],

CodeForces - 95B(搜索+贪心)

题目链接:http://codeforces.com/problemset/problem/95/B 题意:给一个正整数n(1-100000位),求出不小于n的最小幸运.幸运数的概念是:由数量相等的4和7组成的数. 思路: 大体分三种情况: 1.n的位数len为奇数,最简单就是增加一位变成len+1偶数个,前一半为4,后一半为7 2.n的位数len为偶数,但找不到有len位数的幸运数比n大,那么就要增加两位len+2,前一半为4,后一半为7(可以和情况1放在一起) 3.n的位数len为偶数,可以

CodeForces - 1251D (贪心+二分)

题意 https://vjudge.net/problem/CodeForces-1251D 您是一个大型企业的负责人.在您的企业当中共有n位员工为您工作,而且非常有趣的事是这个n是一个奇数(n不能被2整除). 您必须给你的员工分配工资.最初,您有s美元,而第ii个员工应得的薪水应该是li?∼ri?之间的一个值.而无论怎么分配每个人的工资,您必须使得所有分配的工资的中位数最大. 对于一个长度为奇数的序列,如果要找到他的中位数,就需要先对这个序列进行排序,之后找到中间位置的数字.举例来说: 序列[