问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
测试样例
样例1:
输入:
n = 3 ,k = 1
输出:6
样例2:
输入:
n = 2 ,k = 2
输出:6
样例3:
输入:
n = 4 ,k = 3
输出:30
解题思路
- 理解最大公约数为
k:这意味着数组中的每个元素都必须是k的倍数。 - 数组元素两两不同:我们需要确保数组中的元素是唯一的。
- 数组元素之和尽可能小:为了满足这个条件,我们可以从
k开始,依次选择k的倍数,直到数组中有n个元素。
代码提示
我们可以通过以下步骤来实现这个逻辑:
- 初始化一个空数组,用于存储满足条件的元素。
- 从
k开始,依次选择k的倍数,并检查是否已经在数组中。 - 直到数组中有
n个元素,计算这些元素的和。
代码示例-python实现
def solution(n: int, k: int) -> int:
# 初始化一个空数组来存储满足条件的元素
elements = []
# 从 k 开始,依次选择 k 的倍数
current = k
while len(elements) < n:
# 如果当前元素不在数组中,添加到数组
if current not in elements:
elements.append(current)
# 移动到下一个 k 的倍数
current += k
# 计算数组元素之和
result = sum(elements)
return result
if __name__ == '__main__':
print(solution(n = 3, k = 1) == 6)
print(solution(n = 2, k = 2) == 6)
print(solution(n = 4, k = 3) == 30)
关键步骤
- 初始化数组:
elements = [] - 选择
k的倍数:current = k - 检查并添加元素:
if current not in elements: elements.append(current) - 移动到下一个
k的倍数:current += k - 计算和返回结果:
result = sum(elements)
通过这种方式,可以确保数组中的所有元素两两不同。每次添加元素之前,都会检查该元素是否已经存在于数组中,只有在不存在的情况下才会添加。这样可以保证数组中的元素是唯一的。