鉴于我们知道在N个元素中设置了多少位,即如果我们有数组A和数组B的数组。
A store element
B[i] store positions of bits set corresponding to A[i].
然后问题是我们能否找到使用该B阵列将所有A [i]的总和设置为1< = i< = N的总和。
就像说我们有A = [700,40]
As 700 is 1010111100 so we have [2 3 4 5 7 9]
As 40 is 101000 so we have [3 5]
B是[[2,3,4,5,7,9],[3,5]]
我们想要在740中设置的位数。
如何以有效的方式完成这项工作?请帮忙
答案 0 :(得分:1)
这是关于二进制加法。在你的例子中
A[0] = 1010111100 B[0] = [2,3,4,5,7,9]
A[1] = 0000101000 B[1] = [3,5]
A[0]+A[1] = 1011100100
所以总和表示为[2,5,6,7,9]。你能看到在给定B[0]
和B[1]
的情况下如何到达这个数组吗?
以下是如何继续使用两个数组:
set B = B[0]
while B[1] not empty:
for each b in B[1]:
if b not in B:
append b to B
remove b from B[1]
else:
remove b from B
increment each of the remaining elements in B[1] by 1
return length(B)
您必须通过B阵列的元素模仿二进制加法。
要获得设置的位数,只需返回B中的元素数。
答案 1 :(得分:0)
所以给定数组B
,你想在这个例子中计算A
,740元素的总和吗?
易:
int sum = 0;
foreach( var bSubArray in B)
foreach( var b in bSubArray)
sum += Power( 2, b);