通过一次翻转k位使最大值为1

时间:2019-06-13 11:04:29

标签: algorithm mathematical-optimization bit bitstring

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

  • 准确选择k位(不一定连续)并翻转其状态(从0到1,1到0);

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

  • xxxx _
  • xxx_x

'x'表示我们在该位置翻转位。

但是我不确定之后该如何进行,而且我无法再进行任何观察了。那么,什么是正确的方法呢?您可能会认为n ^ 2算法是可行的。

2 个答案:

答案 0 :(得分: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的奇偶性,这将是全1或全是闭合。

答案 1 :(得分:1)

戴夫的方法似乎是正确的。我将分享我在这里发布问题后发现的问题。

让零的数量为z,现在让自己确信,如果k < n,我们可以使用问题中提到的k位运算的组合来翻转任意两个位(一对) 。这里有一个参数可以帮助您满足这一事实,选择除要翻转的那对之外的任何k - 1位;然后从对中选择一位,与我们刚选择的k - 1一起应用操作;然后从对中选择另一位以及我们之前选择的k - 1位,再次应用该操作。如果k - 1k < n至少为n,我们将保证找到这些k + 1辅助位。

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

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

最后声明的说明:如果我们可以同时使用k位翻转和2位翻转,而z恰好是奇数,我们尝试使用一个k位翻转更改其余0的奇偶校验({{1}的奇偶校验)。我们只有在k为奇数的情况下才能这样做,否则我们就不能这样做,对奇数个零使用2位运算将使我们剩下一个零。因此,简而言之,如果z - k等于奇数k,我们将剩下一个0,否则得到全1。