A. Be Positive
问题
给定一个包含 个元素的数组 ,其中每个元素等于 、 或 。在一次操作中,你可以选择一个索引 并将 增加 1(即,赋值 )。操作可以执行任意次数,选择任意索引。
目标是用最少的操作次数使数组中所有元素的乘积严格为正,即 。找到最少的操作次数。
保证这总是可能的。
题解
为了使数组中所有元素的乘积严格为正,必须满足两个条件:
- 数组中不能包含任何零。
- 负一()的数量必须是偶数。
让我们分析一下操作的成本:
- 将一个 变为 需要一次操作()。
- 将一个 变为 需要两次操作()。
首先,我们必须从数组中消除所有的零,因为任何一个零都会使乘积为零。最有效的方法是将每个 都变为 ,每个零需要一次操作。
将所有零转换为一之后,数组只包含 和 。这些元素的乘积为正,当且仅当 的数量是偶数。
让我们计算初始数组中零的数量(zero_count)和负一的数量(neg_count)。
初始操作次数为 zero_count,用于处理所有的零。
此后,如果 neg_count 是奇数,数组元素的乘积将是负数。为了使其为正,我们必须改变奇数个 。最便宜的方法是只将一个 变为 。这会给我们的总操作次数增加 2 次。
所以,总的最少操作次数是:
- 如果
neg_count是偶数,则为zero_count。 - 如果
neg_count是奇数,则为zero_count + 2。
这涵盖了所有情况,并给出了最少的操作次数。