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

75 阅读3分钟

问题描述

小C希望构造一个包含n个元素的数组,且满足以下条件:

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

任务是输出该数组元素之和的最小值。

思路分析

  1. 最大公约数为 k

    • 首先,题目明确规定数组中所有元素的最大公约数是 k。这意味着数组中的所有元素必须是 k 的倍数。即数组中的元素应该是 k,2k,3k,4k,...。
  2. 元素两两不同

    • 题目中要求数组的元素是两两不同的,因此我们不能选重复的数字。例如,如果我们选择了 k,就不能再次选择 k,同理,选择 2k 后不能再选 2k。
  3. 元素之和尽可能小

    • 为了让元素的和尽可能小,我们应该选择最小的 n 个 k 的倍数。最小的 n 个数就是 k,2k,3k,…,nk,因为这是所有符合条件的数字中最小的。
  4. 求和公式

    • 数组的元素和就是这些最小的 n 个 k 的倍数的和: k+2k+3k+...+nk 我们可以将其提取出公因数 k,得到: k×(1+2+3+...+n)
    • 1 到 nnn 的和是一个已知的公式: Sum=n×(n+1)/2
    • 因此,最终的数组元素和为: k×n×(n+1)/2

解题步骤

  1. 理解问题的要求

    • 我们需要选择 n 个不同的数,这些数都是 k 的倍数,并且这些数的和要尽量小。
  2. 选择最小的 n 个 k 的倍数

    • 最小的 n 个 k 的倍数就是 k,2k,3k,…,nk这样可以保证它们的和最小。
  3. 计算和

    • 用公式 k×n×(n+1)/2 来计算最小元素和。

示例

样例 1

  • 输入:n = 3, k = 1
  • 选择最小的 3 个数:1, 2, 3
  • 它们的和是:1 + 2 + 3 = 6
  • 输出:6

样例 2

  • 输入:n = 2, k = 2
  • 选择最小的 2 个数:2, 4
  • 它们的和是:2 + 4 = 6
  • 输出:6

样例 3

  • 输入:n = 4, k = 3
  • 选择最小的 4 个数:3, 6, 9, 12
  • 它们的和是:3 + 6 + 9 + 12 = 30
  • 输出:30

代码实现

def solution(n: int, k: int) -> int:
    # 计算1到n的和
    total_sum = n * (n + 1) // 2
    # 最小元素和 = k * (1 + 2 + 3 + ... + n)
    return k * total_sum

if __name__ == '__main__':
    print(solution(n = 3, k = 1) == 6)
    print(solution(n = 2, k = 2) == 6)
    print(solution(n = 4, k = 3) == 30)

代码解读

在这段代码中:

  1. 我们首先计算了 1 + 2 + ... + n 的和,即使用了常见的公式: Sum=n×(n+1)/2
  2. 然后,将这个和乘以 k,得到了最小的元素和。
  3. 最终,返回计算结果。

知识总结

数学知识点

  1. 等差数列求和公式:题目中的 1+2+3+...+n 是一个简单的等差数列,它的和可以通过公式 Sum=n×(n+1)/2来计算,这是我们在求解过程中使用的一个重要公式。
  2. 最小公倍数和最大公约数:在处理最大公约数为 k 的问题时,我们知道数组的元素必须是 k 的倍数,而选取最小的 n 个倍数能够确保元素之和最小。

编程技巧

  1. 利用数学公式优化计算:通过等差数列求和公式,我们避免了循环累加的复杂度,直接得到结果,优化了性能。

  2. 理解问题的数学本质:面对这类问题时,首先要弄清楚数学上的规律和公式,尤其是常见的等差数列求和等知识。

  3. 提升自己的数学基础:解决这类问题时,掌握一些基本的数学公式和概念能帮助我们更快速地找到解决方案。

总之,通过这道题,我深刻体会到数学思维在编程中的重要性。掌握一些基本的数学公式可以让我们在解决问题时更加得心应手,提升编程效率。