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

  • 相关阅读:
    语言基础
    进制转换
    添加
    查找
    继承
    封装
    面向基础 c#小复习
    主外键
    三个表的关系
    插入信息,模糊查询,聚合函数,时间函数,排序,字符串函数,数学函数,求个数,球最大
  • 原文地址:https://www.cnblogs.com/dragondragon/p/11346355.html
Copyright © 2011-2022 走看看