观察一下数据范围,n,m≤1000,因此我们可以考虑使用O(n∗m)的算法去解决,我们直接暴力枚举array1和array2两两组合的每一种情况,然后对最终得到的数组排一个序,求前k个元素最大和。
const readline = require('readline');
const r1 = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let input = [];
let line = 0;
r1.on('line', function(line) {
input.push(line.trim());
});
r1.on('close', function() {
let nums1 = input[0].split(' ').map(Number);
let nums2 = input[1].split(' ').map(Number);
let k = Number(input[2]);
let sum_total = [];
for (let i = 1; i < nums1.length; i++) {
for (let j = 1; j < nums2.length; j++) {
sum_total.push(nums1[i] + nums2[j]);
}
}
sum_total.sort((a, b) => a - b);
console.log(sum_total.slice(0, Math.min(k, sum_total.length)).reduce((a, b) => a + b, 0));
});
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Integer> v = new ArrayList<>();
while (scanner.hasNextInt()) {
v.add(scanner.nextInt());
}
int k = v.get(v.size() - 1);
v.remove(v.size() - 1);
List<Integer> nums1 = new ArrayList<>();
List<Integer> nums2 = new ArrayList<>();
for (int i = 1; i <= v.get(0); i++) {
nums1.add(v.get(i));
}
for (int i = v.get(0) + 2; i < v.size(); i++) {
nums2.add(v.get(i));
}
List<Integer> sum = new ArrayList<>();
for (int x : nums1) {
for (int y : nums2) {
sum.add(x + y);
}
}
Collections.sort(sum);
long s = 0;
for (int i = 0; i < Math.min(k, sum.size()); i++) {
s += sum.get(i);
}
System.out.println(s);
}
}
nums1 = list(map(int, input().split()))
nums2 = list(map(int, input().split()))
k=int(input())
sum_total=[]
for i in range(1,len(nums1)):
for j in range(1,len(nums2)):
sum_total.append(nums1[i]+nums2[j])
sum_total.sort()
print(sum(sum_total[:min(k,len(sum_total))]))
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>v,sum;
int x;
while(cin>>x){
v.push_back(x);
}
int k=v.back();v.pop_back();
vector<int>nums1,nums2;
for(int i=1;i<=v[0];i++){
nums1.push_back(v[i]);
}
for(int i=v[0]+2;i<v.size();i++){
nums2.push_back(v[i]);
}
for(int &x:nums1){
for(int &y:nums2){
sum.push_back(x+y);
}
}
sort(sum.begin(),sum.end());
long long s=0;
for(int i=0;i<min(k,(int)sum.size());i++){
s+=sum[i];
}
cout<<s<<endl;
return 0;
}
给定两个整数数组array1、array2,数组元素按升序排列。
假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素并对取出的所有元素求和,计算和的最小值。
注意: 两对元素如果对应于array1、array2中的两个下标均相同,则视为同一对元素
输入两行数组array1、array2,每行首个数字为数组大小size(1≤size≤100); 0<array1[i]<=1000 0<array2[i]<=1000 接下来一行为正整数k 1≤k≤array1.size()∗array2.size()
满足要求的最小和
输入
3 1 1 2
3 1 2 3
2
输出
4
说明
选择的数对胃(1,1)和(1,1),总和为4