整数对最小和

题目描述

给定两个整数数组array1, array2, 数组元素按升序排列.

假设从array1、array2中分别取出一个元素可构成一对元素, 现在需要取出k对元素, 并对取出的所有元素求和, 计算和的最小值.

注意:

两对元素如果对应于array1, array2中的两个下标均相同, 则视为同一对元素.

输入描述

  • 输入两行数组array1, array2, 每行首个数字为数组大小size (0 < size <= 100)
    • 0 < array1[i] <= 1000
    • 0 < array2[i] <= 1000
  • 接下来一行为正整数k
    • 0 < k <= array1.size() * array2.size()

输出描述

满足要求的最小和.

示例1

输入:

3 1 1 2
3 1 2 3
2

输出:

4

说明:

  • 用例中, 需要取2对元素
  • 取第一个数组第0个元素与第二个数组第0个元素组成1对元素[1,1]
  • 取第一个数组第1个元素与第二个数组第0个元素组成1对元素[1,1]
  • 求和为1+1+1+1=4, 为满足要求的最小和

题解

Python

import sys

def main():
    # 提取 array1
    part1 = input().split()
    size1 = int(part1[0])
    array1 = list(map(int, part1[1:]))
    assert len(array1) == size1
    assert 0 < size1 <= 100

    # 提取 array2
    part2 = input().split()
    size2 = int(part2[0])
    array2 = list(map(int, part2[1:]))
    assert len(array2) == size2
    assert 0 < size2 <= 100

    # 提取整数 k
    k = int(input())

    # Brute force
    # 取得所有的数对
    all_pairs = []
    for num1 in array1:
        for num2 in array2:
            all_pairs.append(num1 + num2)

    # 以升序排序数对
    all_pairs.sort()

    # 取出前 k 对数对的和, 并计算其总和
    ans = sum(all_pairs[:k])
    print(ans)

if __name__ == "__main__":
    main()