该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
由积至一
题目描述
给定一个包含 n 个整数的数组 a=[a1,a2,…,an]。
你可以对数组中的任意元素进行操作。一次操作 定义为:
- 选定一个下标 i (1≤i≤n);
- 支付 1 枚金币,将 ai 的值增加 1 或 减少 1(即 ai←ai+1 或 ai←ai−1)。
你可以对同一个元素进行多次操作。你的目标是:花费最少的金币,使得数组中所有元素的 乘积 恰好等于 1。
请计算并输出达成该目标所需的 最少金币数量。
输入格式
第一行包含一个整数 n (1≤n≤105),表示数组的长度。
第二行包含 n 个整数 a1,a2,…,an (−109≤ai≤109)。
输出格式
输出一个整数,表示最少需要的金币数量。
输入输出样例 #1
输入 #1
4
2 -3 0 1
输出 #1
4
输入输出样例 #2
输入 #2
4
-1 -1 -1 -1
输出 #2
0
输入输出样例 #3
输入 #3
3
-5 -3 -5
输出 #3
12
说明/提示
样例 1 解释:
一种最优的操作方案如下:
-
a1=2→1(花费 1)
-
a2=−3→−1(花费 2)
-
a3=0→−1(花费 1)
-
a4=1→1(花费 0)
最终数组为 [1,−1,−1,1],乘积为 1×(−1)×(−1)×1=1。
总花费为 1+2+1+0=4。
样例 3 解释:
首先将所有数变为距离最近的 ±1:
-
−5→−1(花费 4)
-
−3→−1(花费 2)
-
−5→−1(花费 4)
此时数组为 [−1,−1,−1],总花费 10,但乘积为 −1。
由于原数组中没有 0 可供调整符号,我们需要额外花费 2 金币将其中一个 −1 变为 1(或者在最初就花费 6 金币将 −5 变为 1)。
总花费为 10+2=12。