【问题标题】:Construct Array A of 1 and -1 of size N,such that sum of all A[i]*A[j] is Minimum and Positive. 1 <= i < j <= N [closed]构造大小为 N 的 1 和 -1 的数组 A,使得所有 A[i]*A[j] 的总和为最小且为正。 1 <= i < j <= N [关闭]
【发布时间】:2020-01-09 20:11:42
【问题描述】:

我在比赛中遇到了这个问题。我们给了一个数 N,我们需要构造一个大小为 N 的数组,它只包含 1 和 -1,使得每对乘积的总和的值最小且为正。 即如果数组是 A 那么

所有 1

例子:

输入 => 3

输出 => [1,1,1]

解释 - 所有可能的情况是:

[1,1,1] = 3

[1,1,-1] = -1

[1,-1,-1] = - 1

[-1,-1,-1] = 3

所以所有组合和最小可能的正例是 3。

我们怎样才能找到这样的数组?

我试图找到一种模式,但没有奏效。

【问题讨论】:

    标签: java python c++ arrays algorithm


    【解决方案1】:

    分析起来很简单,不用写程序。

    让我们注意到:

    (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 &lt;= i &lt; j &lt;= 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 最小时,所以等于0,当N 偶数和1 奇数。

    解决方案:

    1. 对于 N 甚至 - N / 2 乘以 1N / 2 乘以 -1 的任何排列。
    2. 对于 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 &gt; N =&gt; sum_{i}(ai) &gt; sqrt(N)

    如果我们有ceil(sqrt(N)) 乘以1,我们必须在1-1 之间分配N - ceil(sqrt(N)) = A 以保持它们的总和最小。解决方案很明显:

    1. 对于A = 2 * B => B1-1
    2. 对于A = 2 * B + 1 => B + 11B-1

    【讨论】:

    • 这是一个非常好的方法,但实际上我需要一个最小的正数。我认为这不能满足我在问题陈述中给出的示例。
    • @Kamesh-Bakshi 抱歉,我错过了,但基础没问题,请查看我的编辑。
    • 好的,我们只需要解一个简单的方程。假设正面没有。 1 和负数。 -1 的等式 => [ 正 - 负 > sqrt(N) ]。
    • 什么将是决定这个或解决这个方程的快速方法,因为蛮力会变得更糟。
    • 知道了@Andronicus。谢谢。
    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多