【51nod-1315】合法整数集(数位)

【思路】

既然是or操作,将数转化为二进制,数位是1,对应的数组元素+1,再将x转为成二进制,只要查找X为1的位置,将之前存放的数组数字找个最小的输出就可以了。

但是并不是所有的数都要参与or,因为有些数的位数>X,显然这些数是不用删除的,所以不用让这些数加到数组里。还有哪些数呢?当有些数的位数是1,而X对应的位数是0,这些数也是一定不用删除的。综合以上只要满足(x|xx)> x就可以参与or。

【code】

#include <bits/stdc++.h>
using namespace std;
int a[35];
int main()
{
    int n, m, x, c = 0, ans = 1e9;
    cin>>n>>m;
    for(int i=0; i<n; i++)
    {
        scanf("%d", &x);
        if((x|m) > m) continue;//
        c = 0;
        while(x)
        {
            c++;
            if(x & 1) a[c]++;
            x >>= 1;
        }
    }
    c = 0;
    while(m)
    {
        c++;
        if(m & 1) ans = min(ans, a[c]);
        m >>= 1;
    }
    printf("%d\n", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/lesroad/p/9346152.html

时间: 2024-07-30 07:53:15

【51nod-1315】合法整数集(数位)的相关文章

51nod 1315 合法整数集 (位操作理解、模拟、进制转换)

1315 合法整数集 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 一个整数集合S是合法的,指S的任意子集subS有Fun(SubS)!=X,其中X是一个固定整数,Fun(A)的定义如下: A为一个整数集合,设A中有n个元素,分别为a0,a1,a2,...,an-1,那么定义:Fun(A)=a0 or a1 or ... or an-1:Fun({}) = 0,即空集的函数值为0.其中,or为或操作. 现在

51 NOD 1315 合法整数集(思维 + 模拟)

传送门 一个整数集合S是合法的,指S的任意子集subS有Fun(SubS)!=X,其中X是一个固定整数,Fun(A)的定义如下: A为一个整数集合,设A中有n个元素,分别为a0,a1,a2,-,an-1,那么定义:Fun(A)=a0 or a1 or - or an-1:Fun({}) = 0,即空集的函数值为0.其中,or为或操作. 现在给你一个集合Y与整数X的值,问在集合Y至少删除多少个元素能使集合Y合法? 例如:Y = {1,2,4},X=7:显然现在的Y不合法,因为 1 or 2 or

51Nod 1315 合法整数集

一个整数集合S是合法的,指S的任意子集subS有Fun(SubS)!=X,其中X是一个固定整数,Fun(A)的定义如下: A为一个整数集合,设A中有n个元素,分别为a0,a1,a2,...,an-1,那么定义:Fun(A)=a0 or a1 or ... or an-1:Fun({}) = 0,即空集的函数值为0.其中,or为或操作. 现在给你一个集合Y与整数X的值,问在集合Y至少删除多少个元素能使集合Y合法? 例如:Y = {1,2,4},X=7:显然现在的Y不合法,因为 1 or 2 or

给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 &lt;把一个整数各个数位进行全排列&gt;

"""给定一个正整数,实现一个方法求出离该整数最近的大于自身的 换位数 -> 把一个整数各个数位进行全排列""" # 使用 permutations() 方法实现import itertools def full_arrangement(num): my_str = '' my_list = [] permutation = list(itertools.permutations(str(num), len(str(num)))) for

C/C++ 合法整数与字符

一.C语言中的合法整型 首先C语言中的整型有三种表示方式:十进制.八进制和十六进制.(C语言中没有表示二进制的整型) 十进制: 如 int a = 63; //一个正常的整型 八进制: 如果想用8进制对变量进行赋值则这样 int a = 077: //八进制给整型赋值 以数字0开头,由0~7组成 十六进制: int a = 0x3F; //十六进制给整型赋值 以0x开头,由0~F组成 所以我们对合法整数的判断,可以首先从进制判断入手, 若以0开头,则为八进制,不能出现大于等于8的数字: 若以0x

【BZOJ2728】[HNOI2012]与非 并查集+数位DP

[BZOJ2728][HNOI2012]与非 Description Input 输入文件第一行是用空格隔开的四个正整数N,K,L和R,接下来的一行是N个非负整数A1,A2……AN,其含义如上所述. 100%的数据满足K≤60且N≤1000,0<=Ai<=2^k-1,0<=L<=R<=10^18 Output 仅包含一个整数,表示[L,R]内可以被计算出的数的个数 Sample Input 3 3 1 4 3 4 5 Sample Output 4 HINT 样例1中,(3

51Nod 快速傅里叶变换题集选刷

打开51Nod全部问题页面,在右边题目分类中找到快速傅里叶变换,然后按分值排序,就是本文的题目顺序. 1.大数乘法问题 这个……板子就算了吧. 2.美妙的序列问题 长度为n的排列,且满足从中间任意位置划分为两个非空数列后,左边的最大值>右边的最小值.问这样的排列有多少个%998244353. 多组询问,n,T<=100000. 题解:经过分析可知,不合法的排列一定存在这样一种划分: 我们考虑答案=f[i]=i!-不合法排列个数. 形如 2 1 3 4 6 5 这种排列,会有三种划分方式不合法(

51nod 1043 幸运号码(数位DP)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 题目: 1个长度为2N的数,如果左边N个数的和 = 右边N个数的和,那么就是一个幸运号码. 例如:99.1230.123312是幸运号码. 给出一个N,求长度为2N的幸运号码的数量.由于数量很大,输出数量 Mod 10^9 + 7的结果即可. Input 输入N(1<= N <= 1000) Output 输出幸运号码的数量 Mod 10^9 + 7

51nod 1451 合法三角形 判斜率去重,时间复杂度O(n^2)

题目: 这题我WA了3次,那3次是用向量求角度去重算的,不知道错在哪了,不得不换思路. 第4次用斜率去重一次就过了. 注意:n定义成long long,不然求C(3,n)时会溢出. 代码: #include <bits\stdc++.h> using namespace std; typedef long long ll; struct point{ int x;int y; }a[2005]; map <long double,int>::iterator it; int mai