51nod 2493 二进制距离之和

这篇博客介绍了如何计算数组中任意两个数之间的二进制距离总和,提出了从二进制位角度出发的优化算法,将时间复杂度降低到O(nlog(n))。博主详细解释了如何通过枚举二进制位并计算每个位的贡献来得出答案。
摘要由CSDN通过智能技术生成

题目描述:

小b有一个数组a,她想知道a中任意两个数之间二进制距离的总和。

两个整数的二进制距离指的是这两个数字的二进制数对应位不同的数量。

 

输入

第一行输入一个正整数n,表示数组a的长度;
第二行输入a中元素,以空格隔开;
其中0<n≤10^4,a中任意元素a[i]满足0≤a[i]≤10^9

输出

输出一个数,表示二进制距离之和

输入样例

3
4 14 2

输出样例

6

样例解释

在二进制表示中,4表示为0100,14表示为1110,2表示为0010。 4和14的距离为2,因为0100和1110只有右数第2,4位不同。其他同理。 所以答案为: Distance(4, 14) + Distance(4, 2) + Distance(14, 2) = 2 + 2 + 2 = 6.

题解:

如果用双重循环逐个比较2个数,那么需要循环 O(n2)O(n2) 次,每次比较可以暴力来做,也可以利用 xorxor 运算的特性,把问题转为求某个数的二进制表示有多少个 11 。这两种比较的方法,复杂度都是 O(log(n))O(log(n)) 的,因此总的复杂度为 O(n2logn)O(n2logn) 。

[思路2]
如何优化呢?

从另一个角度切入,考虑每一个二进制位上的数对答案的贡献,比如第一个二进制位上有 x 个 0 、 y个 1 ,那么不难计算,这个二进制位上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值