zoukankan      html  css  js  c++  java
  • 异或(按位枚举位运算,十分美妙的错题,带我千百遍刷之熟练之!)

    分析:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N = 55;
    int n;
    int cnt[N];//统计数组 
    
    int main() 
    {
    	int T,x,b;
    	scanf("%d",&T);
    	while (T--)//样例数T 
    	{
    		scanf("%d",&n);//每个样例有n个数 
    		memset(cnt,0,sizeof(cnt));
    		//异或运算(^)对于+是满足结合律的。 a1^x+a2^x+a3^x == (a1+a2+a3)^x. 
    		//按位枚举,统计x的二进制形式中在各个数位上1的个数来嘞! 
    		for(int i=0;i<n;i++)
    		{
    			scanf("%d",&x);//颇有意味。 
    			for(int i=0;i<=30;i++)
    			{
    				if(x&(1<<i)) cnt[i]++;
    			}
    		}
    		
    		long long ans=0;
    		for(int i=0;i<=30;i++)
    		{//同则泯灭为0,异则得生为1. 好巧妙地题目! 
    			ans+=1LL*min(cnt[i],n-cnt[i])*(1<<i);
    		}
    		printf("%lld
    ", ans);
    	}
    	return 0;
    }
    

      REF:https://blog.csdn.net/idrey/article/details/53869954

  • 相关阅读:
    3.10上午学习内容
    计算机网络基础
    2017.3.30-morning
    2017.3.29-afternoon
    2017.3.29-morning
    2017.3.28-afternoon
    2017.3.28-morning
    2017.3.27-afternoon
    2017.3.27-morning
    2017.3.24-morning
  • 原文地址:https://www.cnblogs.com/dragondragon/p/11346355.html
Copyright © 2011-2022 走看看