#P3034. 整数对最小和(100分)
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 244
            Accepted: 56
            Difficulty: 4
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>暴力枚举          
 
整数对最小和(100分)
思路:排序+模拟
观察一下数据范围,n,m≤1000,因此我们可以考虑使用O(n∗m)的算法去解决,我们直接暴力枚举array1和array2两两组合的每一种情况,然后对最终得到的数组排一个序,求前k个元素最大和。
JavaScript
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));
});
Java
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);
    }
}
Python
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))]))
C++
#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