问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
测试样例
样例1:
输入:
n = 3 ,k = 1
输出:6
样例2:
输入:
n = 2 ,k = 2
输出:6
样例3:
输入:
n = 4 ,k = 3
输出:30解题思路
- 理解最大公约数为
k:这意味着数组中的每个元素都必须是k的倍数。 - 两两不同:数组中的元素不能重复。
- 元素之和最小:我们需要找到最小的
n个k的倍数,使得它们的和最小。
代码提示
我们可以通过以下步骤来实现这个逻辑:
- 生成
k的倍数:从k开始,每次增加k,直到生成n个不同的倍数。 - 计算这些倍数的和:将这些倍数相加,得到最小和。
代码框架
ef solution(n: int, k: int) -> int:
# 初始化一个列表来存储 k 的倍数
multiples = []
# 从 `k` 开始,生成 `n` 个不同的 `k` 的倍数
current_multiple = k
while len(multiples) < n:
# 如果当前倍数不在列表中,添加到列表
if current_multiple not in multiples:
multiples.append(current_multiple)
# 继续下一个倍数
current_multiple += k
# 计算这些倍数的和
min_sum = sum(multiples)
return min_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) ### 关键步骤解释
- 初始化列表:我们使用一个列表
multiples来存储k的倍数。 - 生成倍数:从
k开始,每次增加k,直到列表中有n个不同的倍数。 - 计算和:将列表中的所有元素相加,得到最小和。 为了确保数组中的所有元素两两不同,我们可以通过以下步骤来实现:
解题思路
-
生成
k的倍数:从k开始,每次增加k,直到生成n个不同的倍数。 -
检查重复:在添加新倍数到列表之前,检查该倍数是否已经存在于列表中。
-
关键步骤解释
-
初始化列表:我们使用一个列表
multiples来存储k的倍数。 -
生成倍数:从
k开始,每次增加k,直到列表中有n个不同的倍数。 -
检查重复:在添加新倍数到列表之前,使用
if current_multiple not in multiples:来检查该倍数是否已经存在于列表中。
通过这种方式,我们可以确保数组中的所有元素两两不同。 最后,通过对于该代码的练习。我学会了如何使得数组之间元素之和排序和最小值的设定,收获很多