构造大小为N的1和-1的数组A,以使所有A [i] * A [j]的总和为最小值和正数。 1 <= i <j <= N

时间:2019-09-07 04:20:21

标签: java python c++ arrays algorithm

我在比赛中遇到了这个问题。我们给定了一个数字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。

我们如何找到这样的数组?

我试图找到一种模式,但这没有用。

1 个答案:

答案 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(仅-11),因此解决方案是当(sum_{i}(ai))^2为最小,等于0N偶数时,1奇数时。

解决方案:

  1. 对于N甚至-N / 21N / 2-1的任何排列。
  2. 对于N个奇数-(N - 1) / 21(N + 1) / 2-1(N - 1) / 2-1的任何排列, (N + 1) / 21

编辑-获得最低的正值总和:

具有以下基础:

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)) = A1之间分配-1,以使它们的和最小。解决方案是obvoius:

  1. A = 2 * B => B1-1的时间。
  2. 对于A = 2 * B + 1 => B + 1倍,1B倍,-1