构造大小为 N 的数组 A 和大小为 1 的数组 A,使得所有 A[i]*A[j] 的总和为最小值和正数。1 <= i < j <= N
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
我在比赛中遇到了这个问题。我们给出了一个数字 N,我们需要构造一个大小为 N 的数组,该数组仅由 1 和 -1 组成,使得每对乘积的总和值为最小值和正值。 即如果数组是 A,则
( A[i] * A[j] ( 在全部 1 <= i
<= N 上的和是最小值和正数。
例:
输入 => 3
输出 => [1,1,1]
解释 - 所有可能的情况是:
[1,1,1] = 3
[1,1,-1] = -1
[1,-1,-1] = - 1
[-1,-1,-1] = 3
因此,所有组合和最小可能的阳性情况都是 3。
我们如何找到这样的数组?
我试图找到一种模式,但没有奏效。
从分析上讲,它非常简单,无需为其编写程序。
让我们注意,:
(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
,我们必须在1
和-1
之间分配N - ceil(sqrt(N)) = A
,以保持它们的总和最小。解决方案是倾斜的:
- 对于
A = 2 * B
=>B
乘以1
和-1
. - 对于
A = 2 * B + 1
=>B + 1
倍1
和B
倍-1
.
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '