我在比赛中遇到了这个问题。我们给定了一个数字N,我们需要构造一个大小为N的数组,该数组仅由1和-1组成,以使每对乘积的总和的值最小且为正。 即如果数组为A,则
(A [i] * A [j])全部1 <= i
示例:
输入=> 3
输出=> [1,1,1]
说明-所有可能的情况是:
[1,1,1] = 3
[1,1,-1] = -1
[1,-1,-1] =-1
[-1,-1,-1] = 3
因此所有组合以及最小可能的正数为3。
我们如何找到这样的数组?
我试图找到一种模式,但这没有用。
答案 0 :(得分:4)
从表面上讲,这非常简单,无需为此编写程序。
请注意,
(a1 + a2 + ... + an)^2 = (a1^2 + a2^2 + ... + an^2) + 2 * (a1a2 + a1a3 + ... + ana(n-1))
或者换句话说(在这里不能很好地格式化):
(sum_{i}(ai))^2 = sum_{i}(ai^2) + 2 * sum_{1 <= i < j <= N}(ai * aj)
我们在这里寻找sum_{1 <= i < j <= N}(ai * aj)
。
经过一些简单的添加,我们得到:
sum_{1 <= i < j <= N}(ai * aj) = 1 / 2 * ((sum_{i}(ai))^2 - sum_{i}(ai^2))
还要注意,sum_{i}(ai^2)
是常数,因为它等于N
(仅-1
或1
),因此解决方案是当(sum_{i}(ai))^2
为最小,等于0
,N
偶数时,1
奇数时。
解决方案:
N
甚至-N / 2
倍1
和N / 2
倍-1
的任何排列。N
个奇数-(N - 1) / 2
倍1
和(N + 1) / 2
倍-1
或(N - 1) / 2
倍-1
的任何排列, (N + 1) / 2
倍1
。编辑-获得最低的正值总和:
具有以下基础:
sum_{1 <= i < j <= N}(ai * aj) = 1 / 2 * ((sum_{i}(ai))^2 - sum_{i}(ai^2)) = 1 / 2 * ((sum_{i}(ai))^2 - N)
我们需要找到ai,以便(sum_{i}(ai))^2 > N => sum_{i}(ai) > sqrt(N)
。
如果我们有ceil(sqrt(N))
倍1
倍,就必须在N - ceil(sqrt(N)) = A
和1
之间分配-1
,以使它们的和最小。解决方案是obvoius:
A = 2 * B
=> B
倍1
和-1
的时间。A = 2 * B + 1
=> B + 1
倍,1
和B
倍,-1
。