📅  最后修改于: 2023-12-03 15:28:25.404000             🧑  作者: Mango
给定一棵空树和一个整数数组,树的每个节点需要填入数组中的一个值,并且需要满足每个节点都是其子节点的GCD。
要求使用数组中的元素填充树节点并最小化所有节点值的和。
因为每个节点都是其子节点的GCD,所以我们可以使用一个递归算法来实现。
首先,我们需要找到根节点的值,如果数组中只有一个元素,则直接作为根节点的值。如果有多个元素,则选取两个元素的GCD作为根节点的值。
然后,对于每个节点,我们需要选取数组中与其父节点GCD值相同的元素。如果存在多个这样的元素,则选取其中的最小值作为该节点的值。
最后,对于每个非叶子节点,我们需要将其子节点的值相加,并将结果赋给该节点。最终,所有节点值的和即为结果。
def fill_tree(arr, parent_gcd):
if len(arr) == 1:
return arr[0]
min_val = min(arr)
if min_val == parent_gcd:
return min_val
left_arr, right_arr = [], []
for val in arr:
if val % parent_gcd == 0:
left_arr.append(val)
else:
right_arr.append(val)
left_val = fill_tree(left_arr, min_val)
right_val = fill_tree(right_arr, parent_gcd)
return left_val + right_val
def min_sum(arr):
root_val = reduce(gcd, arr)
return fill_tree(arr, root_val)
其中,gcd函数用于计算两个数的最大公约数,reduce函数用于对整个数组进行reduce操作,将其中的所有元素依次传入指定函数,并返回最终结果。