通过一次翻转 k 位来生成最大的 1

Make maximum 1's by flipping k bits at a time

给定一个 n 位向量和一个整数 k,1 <= k <= n,我们必须通过以下操作任意次数(包括零次)来最大化其中的个数:

经过一番分析,我得出结论,如果n > k,我们也可以同时翻转任意两个位。例如对于 n = 5,k = 4。我们可以做这样的事情来只翻转最后两位。

'x'表示我们翻转那个位置的位。

但我不确定之后如何进行,我无法进行更多观察。那么,什么才是正确的做法呢?您可以假设 n^2 算法是可行的。

翻转零,直到零的数量低于 k。令 m 为零的个数。

翻转 k - m/2 个和 m/2 个零(整数除法)。现在你有 m + (k-m/2) - m/2 = m + k - m/2 - m/2 ~ k 个零。 (整数除法的近似b/c)。

最后,翻转所有的零,并根据需要翻转尽可能多的零,总共翻转 k 次。这将是全部或关闭取决于 m 的奇偶校验。

Dave 的方法似乎是正确的。我将在此处发布问题后分享我的想法。

让零的个数为z,现在说服自己,如果k < n,我们可以通过使用k-bit运算的组合来翻转任意两位(一对)问题中提到。这里有一个论点可以帮助您满足这个事实,选择除您要翻转的那对之外的任何 k - 1 位;然后从一对中选择一个位以及我们刚刚选择的 k - 1 ,应用操作;然后从该对中选择另一个位以及我们之前选择的相同 k - 1 位,再次应用该操作。如果 k < nn 至少为 k + 1.

,我们可以保证找到这些 k - 1 辅助位

所以很自然地,会出现两种情况:

  • k == n :显然我们只能翻转全部或翻转 none。所以答案是max(n - z, z)
  • k < n :在这种情况下,我们可以翻转任何 k 位或者我们可以翻转任何 2 位(使用上面的参数)。现在,如果 z < k,我们只能使用 2 位翻转,如果 z 是奇数,我们剩下一位仍然是 0,答案是 n - 1;如果 z 是偶数,我们将它们全部翻转为 1,所以答案是 n。现在当 z >= k 时,我们可以同时使用 k-bit fips 和 2 位翻转,声明是,如果 z 是奇数并且 k 是偶数,我们只剩下一个0(答案是 n - 1)否则我们总能把所有的 0 变成 1(答案是 n)。

最后一个声明的解释:如果我们可以同时使用k-bit翻转和2位翻转并且z恰好是奇数,我们尝试使用一个 k-bit 翻转来改变剩余 0 的奇偶性(z - k 的奇偶性)。如果 k 是奇数,我们只能这样做,否则我们不能这样做,并且对奇数个零使用 2 位运算将使我们得到一个零。所以,简而言之,如果 k 与奇数 z 是偶数,我们将留下一个 0,否则我们将得到全 1。