【问题标题】:Choose an element from array to maximize sum after XOR all elements in array从数组中选择一个元素以在对数组中的所有元素进行异或后最大化总和
【发布时间】:2022-07-11 13:22:05
【问题描述】:

你得到一个数组 A。你必须从这个数组中选择一个元素,比如 A[k],并形成一个新的数组 B,使得 B[i] = A[i]^A[k]。 (^ 表示按位异或)。
现在数组的分数将是 B 的所有元素的总和。
任务是找到数组得分最大的元素。
示例-
如果 A = [15,11,8]
我们选择 A[k] = 15 然后 B 将是 [0,4,7] (15^15=0,15^11=4,15^8=7)。分数将是 0+4+7 = 11,这是我们通过选择任何元素作为 A[k] 可以获得的最大值。
另一个例子-
如果 A = [11,12,13,14,15] 最大可能得分 = 22。
我们如何解决这个问题来选择一个产生最高分数的元素。
如何解决这个问题或如何处理这些问题?

【问题讨论】:

  • 这不是真的,我试过但无法解决这就是为什么在这里问。
  • “显示不努力”不是关闭问题的正当理由,但 Yash - 评论指出问题没有描述您尝试或未尝试的内容,而不是说明你没有尝试任何东西。 meta.stackoverflow.com/questions/334822/… 描述了如何在 s-o 上提出(和回答)家庭作业问题。

标签: arrays algorithm bit-manipulation bitwise-operators bit


【解决方案1】:

许多异或算法问题的答案是一点一点地工作。在这里,如果对于每个位位置,您计算设置了该位的数组元素的数量(顺便告诉您通过从数组长度中减去多少数组元素没有设置该位),您有一种快速计算的方法sum(A[i] xor X) 对于任何 X,通过考虑每个可能位贡献的总和部分。这种计算和的方式取决于数组中最大数的位宽,而不是数组的长度。

完成此操作后,您可以简单地遍历数组并找到使总和最大化的元素。

如果你做对了,那么算法是 O(NW),其中 N 是输入数组的长度,W 是最小的数字,使得每个输入数字都适合 W 位整数。它会使用 O(W) 额外的存储空间。 (通常,这些算法问题会限制输入的大小,因此它们适合 int32 或 int64,因此 W 将是 32 或 64)。

【讨论】:

  • 一旦我们有了设置了该位的数组元素,之后你能告诉我如何计算总和(A[i] xor X),我无法理解。跨度>
  • 计算每个一位数 B 的 sum((A[i]&B) xor X),然后将它们加在一起。您可以使用位 B 设置/清除的数组元素数量的已计算计数在 O(1) 时间内计算这些总和,但您可能需要考虑如何计算。
  • 了解您的方法并编写了代码。谢谢保罗。
【解决方案2】:

你能帮我解答吗

【讨论】:

    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多