题目描述

给定两个整数数组 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. 组合出所有可能的整数对,并求和
  2. 对所有求和结果升序排序
  3. 对最小的k个和进行求和

Java实现

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    try (Scanner scanner = new Scanner(System.in)) {
      int[] arr1 = parseArr(scanner.nextLine());
      int[] arr2 = parseArr(scanner.nextLine());
      int k = scanner.nextInt();
      fn(arr1, arr2, k);
    }
  }

  private static void fn(int[] arr1, int[] arr2, int k) {
    int initialCapacity = arr1.length * arr1.length;
    List<Integer> sums = new ArrayList<>(initialCapacity);
    for (int x : arr1) {
      for (int y : arr2) {
        sums.add(x + y);
      }
    }
    sums.sort(Integer::compareTo);
    int res = 0;
    for (int i = 0; i < k; i++) {
      res += sums.get(i);
    }
    System.out.println(res);
  }

  private static int[] parseArr(String line) {
    String[] split = line.split(" ");
    int[] arr = new int[split.length];
    for (int i = 0; i < arr.length; i++) {
      arr[i] = Integer.parseInt(split[i]);
    }
    return arr;
  }
}

Python实现

# 读取输入
line1, line2, k = input(), input(), int(input())

# 函数用于将字符串解析为列表
def parse_array(line):
    split = line.split()
    return [int(split[s]) for s in range(1, len(split))]


# sums用于保存所有整数对的和,res用于最终保存结果
sums, res = [], 0
# 组合出所有可能的整数对,并求和
for x in parse_array(line1):
    for y in parse_array(line2):
        sums.append(x + y)
# 升序排序
sums.sort()
# 前k个求和
for i in range(k):
    res += sums[i]

print(res)
最后修改日期: 2023年3月22日