2026/4/15 5:02:57
网站建设
项目流程
观光园网站建设,用sql2000做网站,网上平台,wordpress 主题末班(新卷,100分)- 整数对最小和#xff08;Java JS Python C#xff09;题目描述给定两个整数数组array1、array2#xff0c;数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素#xff0c;现在需要取出k对元素#xff0c;并对取出…(新卷,100分)- 整数对最小和Java JS Python C题目描述给定两个整数数组array1、array2数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素现在需要取出k对元素并对取出的所有元素求和计算和的最小值。注意两对元素如果对应于array1、array2中的两个下标均相同则视为同一对元素。输入描述输入两行数组array1、array2每行首个数字为数组大小size(0 size 100);0 array1[i] 10000 array2[i] 1000接下来一行为正整数k0 k array1.size() * array2.size()输出描述满足要求的最小和用例输入3 1 1 23 1 2 32输出4说明用例中需要取2对元素取第一个数组第0个元素与第二个数组第0个元素组成1对元素[1,1];取第一个数组第1个元素与第二个数组第0个元素组成1对元素[1,1];求和为11114为满足要求的最小和。题目解析本题很简单双重for找出所有整数对并记录整数对之和然后排序整数对之和取出前k个求和就是题解。输入的两个数组的长度均不大于100因此双重for的O(n^2)复杂度也可以接受。到网上找了一下本题好像还有O(nlogn)时间复杂度的算法是基于最小堆实现的后面有机会实现一下。最小堆其实就是优先队列基于完全二叉树实现上浮下沉操作即可。JavaScript算法源码/* JavaScript Node ACM模式 控制台输入获取 */ const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines []; rl.on(line, (line) { lines.push(line); if (lines.length 3) { const arr1 lines[0].split( ).map(Number); const n arr1.shift(); const arr2 lines[1].split( ).map(Number); const m arr2.shift(); const k parseInt(lines[2]); console.log(getMaxSumofK(arr1.slice(0, n), arr2.slice(0, m), k)); lines.length 0; } }); function getMaxSumofK(arr1, arr2, k) { const pairs []; for (let i 0; i arr1.length; i) { for (let j 0; j arr2.length; j) { pairs.push(arr1[i] arr2[j]); } } pairs.sort((a, b) a - b); let sum 0; for (let i 0; i k; i) { sum pairs[i]; } return sum; }Java算法源码import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); int n1 sc.nextInt(); int[] arr1 new int[n1]; for (int i 0; i n1; i) arr1[i] sc.nextInt(); int n2 sc.nextInt(); int[] arr2 new int[n2]; for (int i 0; i n2; i) arr2[i] sc.nextInt(); int k sc.nextInt(); System.out.println(getResult(arr1, arr2, k)); } public static int getResult(int[] arr1, int[] arr2, int k) { ArrayListInteger pairs new ArrayList(); for (int v1 : arr1) { for (int v2 : arr2) { pairs.add(v1 v2); } } pairs.sort((a, b) - a - b); int sum 0; for (int i 0; i k; i) sum pairs.get(i); return sum; } }Python算法源码# 输入获取 arr1 list(map(int, input().split()))[1:] arr2 list(map(int, input().split()))[1:] k int(input()) # 算法入口 def getResult(): pairs [] for v1 in arr1: for v2 in arr2: pairs.append(v1 v2) pairs.sort() sumV 0 for i in range(k): sumV pairs[i] return sumV # 算法调用 print(getResult())C算法源码#include stdio.h #include stdlib.h int cmp(const void *a, const void *b) { return *((int *) a) - *((int *) b); } int main() { int size1; scanf(%d, size1); int nums1[size1]; for (int i 0; i size1; i) { scanf(%d, nums1[i]); } int size2; scanf(%d, size2); int nums2[size2]; for (int i 0; i size2; i) { scanf(%d, nums2[i]); } int k; scanf(%d, k); int size size1 * size2; int pairs[size]; int pairs_size 0; for (int i 0; i size1; i) { for (int j 0; j size2; j) { pairs[pairs_size] nums1[i] nums2[j]; } } qsort(pairs, pairs_size, sizeof(int), cmp); int sum 0; for (int i 0; i k; i) { sum pairs[i]; } printf(%d\n, sum); return 0; }