zoukankan      html  css  js  c++  java
  • CSU

    Description

    As is known to all, Wells is impoverished.
    When God heard that, God decide to help the poor Wells from terrible condition.
    One day Wells met God in dream, God gave Wells a secret number which will bought Wells a great fortune and gifted Wells an ablility of transforming two lottery tickets x, y into a lottery ticket z (meet the condition that z==x or y).

    Wells realized that the number must be the result of lottery, which would be worth ¥5,000,000! Wells was very excited, and can't help sharing this thought. The secret number is X, and Wells has purchase N lottery tickets a1,a2,a3....aNa1,a2,a3....aN but has not received them yet. And if lucky enough, Wells could pick some numbers of them satisfy that b1orb2orb3....orbk=Xb1orb2orb3....orbk=X, k is the amount of picked numbers.

    How ever the owner of the lottery shop called SDJ, who decided to modify the lottery tickets and made Wells lost his fortune. In order to save energy to modify the lottery tickets, SDJ want to know the minimum amount of modification of lottery tickets.

    Input

    The input only contains one line.
    First line contains two positive integers N (N<=105)(N<=105),X (X<=109)(X<=109) ,N means as described above Second line contains N number a1,a2...aN(0<=ai<=109),aia1,a2...aN(0<=ai<=109),ai means the number on i-th lottery tickets.

    Output

    Output a line only contains minimum amount of modification of lottery tickets.

    Sample Input

    3 7 
    4 2 1
    

    Sample Output

    1
    

    Hint

    It will be accepted after modifying any number.
    The "or" in this problem means the bitwise or , for exmple , 0 or 0 = 0 ,0 or 1 = 1 , 1 or 1 = 1 , 3 or 5 =7.

    Source

    Author

    Wells

    题意:问最少改变多少个数,使任意数之间或运算都不能得到要求的数。

    思路:考虑数字的每一个bit位,对于ai | X ==X 的说明对答案有贡献,把ai所有不为0的bit位的贡献+1即可 最后输出X所有为1的bit位的贡献得最小值 每个ai在判断有贡献后将1-30个bit位都for一遍计算贡献.

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    int n, x,m;
    int cnt[35];
    int main()
    {
    	while (~scanf("%d%d", &n, &x))
    	{
    		memset(cnt, 0, sizeof(cnt));
    		int min = (1 << 30);
    		
    		for (int i = 0; i < n; i++)
    		{
    			scanf("%d", &m);
    			if ((m | x) == x)
    			{
    				for (int j = 0; (1 << j) <= m; j++)
    				{
    					if ((1 << j)&m)
    						cnt[j]++;
    				}
    			}
    		}
    		for (int i = 0; (1<<i) <=x; i++)
    		{
    			if (((1 << i)&x))
    				min = min > cnt[i] ? cnt[i] : min;
    		}
    		printf("%d
    ", min);
    
    	}
    
    	return 0;
    }

  • 相关阅读:
    时间处理得到UTC时间
    java数据同步陷阱
    360公司2016笔试题
    YTU 1439: 2.4.5 Fractions to Decimals 分数化小数
    YTU 2422: C语言习题 n个数逆序
    YTU 2421: C语言习题 矩形法求定积分
    YTU 2427: C语言习题 整数排序
    YTU 2832: 使用指针访问数组元素--程序填空
    YTU 1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换
    HDU 1069:Monkey and Banana
  • 原文地址:https://www.cnblogs.com/csu-lmw/p/9124461.html
Copyright © 2011-2022 走看看