通过一次翻转 k 位来生成最大的 1
Make maximum 1's by flipping k bits at a time
给定一个 n 位向量和一个整数 k,1 <= k <= n,我们必须通过以下操作任意次数(包括零次)来最大化其中的个数:
- 恰好选择k位(不一定连续)并翻转它们的状态(0到1,1到0);
经过一番分析,我得出结论,如果n > k,我们也可以同时翻转任意两个位。例如对于 n = 5,k = 4。我们可以做这样的事情来只翻转最后两位。
- xxxx_
- xxx_x
'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 < n
或 n
至少为 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。
给定一个 n 位向量和一个整数 k,1 <= k <= n,我们必须通过以下操作任意次数(包括零次)来最大化其中的个数:
- 恰好选择k位(不一定连续)并翻转它们的状态(0到1,1到0);
经过一番分析,我得出结论,如果n > k,我们也可以同时翻转任意两个位。例如对于 n = 5,k = 4。我们可以做这样的事情来只翻转最后两位。
- xxxx_
- xxx_x
'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 < n
或 n
至少为 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。