📌  相关文章
📜  通过按该顺序为每个递增递减的连续对分配值来实现最小总和(1)

📅  最后修改于: 2023-12-03 15:28:26.264000             🧑  作者: Mango

通过按该顺序为每个递增递减的连续对分配值来实现最小总和

此方法的目的是尽可能减少数字对的总和,将每个递增递减的连续对分配一个值。

实现步骤
步骤1:按照相邻元素的差值得出递增和递减的连续对。

示例代码:

def get_pairs(arr):
    pairs = []
    len_arr = len(arr)
    for i in range(len_arr-1):
        if arr[i] < arr[i+1]:
            pairs.append((i, i+1, arr[i+1]-arr[i], "inc"))
        elif arr[i] > arr[i+1]:
            pairs.append((i, i+1, arr[i]-arr[i+1], "dec"))
    return pairs
步骤2:按照差值从小到大排序。

示例代码:

pairs = get_pairs(arr)
pairs = sorted(pairs, key=lambda x: x[2])
步骤3:从小到大遍历差值,并依次将每个连续对中的较小数分配给它。

示例代码:

pos = 0
neg = 0
for pair in pairs:
    i, j, diff, trend = pair
    if trend == "inc":
        arr[j] -= pos+1
        pos += 1
    elif trend == "dec":
        arr[j] += neg+1
        neg += 1
完整代码
def get_pairs(arr):
    pairs = []
    len_arr = len(arr)
    for i in range(len_arr-1):
        if arr[i] < arr[i+1]:
            pairs.append((i, i+1, arr[i+1]-arr[i], "inc"))
        elif arr[i] > arr[i+1]:
            pairs.append((i, i+1, arr[i]-arr[i+1], "dec"))
    return pairs


def get_min_sum(arr):
    pairs = get_pairs(arr)
    pairs = sorted(pairs, key=lambda x: x[2])
    pos = 0
    neg = 0
    for pair in pairs:
        i, j, diff, trend = pair
        if trend == "inc":
            arr[j] -= pos+1
            pos += 1
        elif trend == "dec":
            arr[j] += neg+1
            neg += 1
    return sum([abs(num) for num in arr])


if __name__ == "__main__":
    arr = [5, 6, 1, 3, 5, 2]
    min_sum = get_min_sum(arr)
    print(min_sum)

以上便是通过按该顺序为每个递增递减的连续对分配值来实现最小总和的介绍和代码,可以通过调用 get_min_sum 函数来实现。