数组元素之和最小化题解 | 豆包MarsCode AI 刷题

144 阅读3分钟

题目描述

题目要求我们构造一个包含 nn 个元素的数组,满足以下条件:

  1. 数组中的所有元素两两不同。
  2. 数组元素的最大公约数(GCD)为 kk。
  3. 数组元素之和尽可能小。

思路分析

要使得数组的元素的最大公约数是 kk,我们可以做如下的推导:

  • 如果数组的最大公约数是 kk,则数组中的所有元素都应该是 kk 的倍数。因此,我们可以将数组中的每个元素表示为 k×xik×xi​,其中 xixi​ 是正整数,且 x1,x2,…,xnx1​,x2​,…,xn​ 必须是不同的。
  • 题目要求数组元素之和尽可能小,那么要想最小化和,就应该让 x1,x2,…,xnx1​,x2​,…,xn​ 尽量小且不同。
  • 因此,我们可以选择 x1,x2,…,xnx1​,x2​,…,xn​ 为从 1 到 nn 的整数,即 xi=ixi​=i(为了满足元素两两不同),这样可以保证元素之和最小。
  • 所以数组的元素可以选择为 k×1,k×2,…,k×nk×1,k×2,…,k×n。

数组元素之和

对于数组元素 a1,a2,…,ana1​,a2​,…,an​,我们有:

ai=k×i(i = 1, 2, ..., n)ai​=k×i(i = 1, 2, ..., n)

那么数组的和为:

S=k×1+k×2+⋯+k×n=k×(1+2+⋯+n)S=k×1+k×2+⋯+k×n=k×(1+2+⋯+n)

根据等差数列求和公式:

1+2+⋯+n=n(n+1)21+2+⋯+n=2n(n+1)​

因此,数组的和为:

S=k×n(n+1)2S=k×2n(n+1)​

最终解答

数组元素之和的最小值是 k×n(n+1)2k×2n(n+1)​。

算法步骤

  1. 计算 n(n+1)22n(n+1)​。
  2. 计算数组元素之和 S=k×n(n+1)2S=k×2n(n+1)​。
  3. 输出最小值 SS。

复杂度分析

  • 时间复杂度:计算和 n(n+1)22n(n+1)​ 需要常数时间 O(1)O(1)。
  • 空间复杂度:只需要常数空间 O(1)O(1)。

示例

输入:
  • n=3n=3
  • k=2k=2
输出:
  • 2×3×42=2×6=122×23×4​=2×6=12
解释:
  • 数组的元素可以选择为 2×1,2×2,2×32×1,2×2,2×3,即 2,4,62,4,6。
  • 它们的和是 2+4+6=122+4+6=12,满足题目条件。 下面是用 Python 实现的代码,计算给定 nn 和 kk 下数组元素之和的最小值:
pythonCopy Code
def min_sum_of_array(n, k):
    # 计算1 + 2 + ... + n的和
    sum_of_first_n = n * (n + 1) // 2
    # 最小和为 k * sum_of_first_n
    return k * sum_of_first_n

# 测试
n = int(input("请输入n: "))  # 输入n
k = int(input("请输入k: "))  # 输入k

result = min_sum_of_array(n, k)
print(f"最小和为: {result}")

代码说明:

  1. min_sum_of_array 函数计算给定 nn 和 kk 下数组元素之和的最小值。我们使用等差数列求和公式计算 1+2+...+n1+2+...+n 的和,然后乘以 kk。
  2. 输入:  用户输入数组的大小 nn 和最大公约数 kk。
  3. 输出:  输出满足条件的数组元素之和的最小值。