A. Be Positive

问题

给定一个包含 nn 个元素的数组 aa,其中每个元素等于 1-10011。在一次操作中,你可以选择一个索引 ii 并将 aia_i 增加 1(即,赋值 ai:=ai+1a_i := a_i + 1)。操作可以执行任意次数,选择任意索引。

目标是用最少的操作次数使数组中所有元素的乘积严格为正,即 a1a2a3an>0a_1 \cdot a_2 \cdot a_3 \cdot \ldots \cdot a_n > 0。找到最少的操作次数。

保证这总是可能的。

题解

为了使数组中所有元素的乘积严格为正,必须满足两个条件:

  1. 数组中不能包含任何零。
  2. 负一(1-1)的数量必须是偶数。

让我们分析一下操作的成本:

  • 将一个 00 变为 11 需要一次操作(010 \to 1)。
  • 将一个 1-1 变为 11 需要两次操作(101-1 \to 0 \to 1)。

首先,我们必须从数组中消除所有的零,因为任何一个零都会使乘积为零。最有效的方法是将每个 00 都变为 11,每个零需要一次操作。

将所有零转换为一之后,数组只包含 111-1。这些元素的乘积为正,当且仅当 1-1 的数量是偶数。

让我们计算初始数组中零的数量(zero_count)和负一的数量(neg_count)。 初始操作次数为 zero_count,用于处理所有的零。

此后,如果 neg_count 是奇数,数组元素的乘积将是负数。为了使其为正,我们必须改变奇数个 1-1。最便宜的方法是只将一个 1-1 变为 11。这会给我们的总操作次数增加 2 次。

所以,总的最少操作次数是:

  • 如果 neg_count 是偶数,则为 zero_count
  • 如果 neg_count 是奇数,则为 zero_count + 2

这涵盖了所有情况,并给出了最少的操作次数。

提交链接