给定一个n位向量和一个整数k,1 <= k <= n,我们必须通过多次执行以下操作(包括零次)来最大化其中的个数:
经过分析,我得出结论,如果n> k,我们也可以同时翻转任意两位。例如,对于n = 5,k =4。我们可以这样做,仅翻转最后两位。
'x'表示我们在该位置翻转位。
但是我不确定之后该如何进行,而且我无法再进行任何观察了。那么,什么是正确的方法呢?您可能会认为n ^ 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 - 1
或k < 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。