题目:http://hihocoder.com/contest/hihointerview22/problem/2
题意:
The Hamming Distance 是指两个整数二进制数字不同的个数。给出n和n个数,求每两个数之间的The Hamming Distance 的总和。
分析:
数据范围是
For 80% of the data: 1 <= N <= 1000
For 100% of the data: 1 <= N <= 100000 1 <= Ai <= 1000000000
如果直接两两比较肯定是会超时的,可以预处理一下,把每个位置的存在的值记录下来,因为每两个都要比较,所以最后将第i位置上为0的数字个数和为1的相乘,就得出第i位置上的结果。全加起来就是最终结果。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
typedef long long ll;
int main()
{
int n;
scanf("%d",&n);
ll sum=0,a,b,s[35][2]={0};
for(int i=0;i<n;i++)
{
ll t,hx=0;
scanf("%lld",&t);
for(int i=0;i<32;i++)
{
s[i][t%2]++;
t/=2;
}
}
//s[i][0]表示二进制上第i为0的数有几个。
for(int i=0;i<32;i++)
sum+=s[i][1]*s[i][0];
printf("%lld\n",sum);
}
ps:这分析我自己看了都觉得写的烦。