package JiChuLianxi;
import java.util.Scanner;
/*
* 问题描述
给两组数,各n个。
请调整每组数的排列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最小。要求程序输出这个最小值。
例如两组数分别为:1 3 -5和-2 4 1
那么对应乘积取和的最小值应为:
(-5) * 4 + 3 * (-2) + 1 * 1 = -25
输入格式
第一个行一个数T表示数据组数。后面每组数据,先读入一个n,接下来两行每行n个数,每个数的绝对值小于等于1000。
n<=8,T<=1000
输出格式
一个数表示答案。
样例输入
2
3
1 3 -5
-2 4 1
5
1 2 3 4 5
1 0 1 0 1
样例输出
-25
6
*/
/**
* 疑惑:若全部一起输入,如何区分每次输入的数组
* @author Administrator
*
*/
public class TwoArrayMin {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int TempResult = 0;
int a = input.nextInt(); //记录有几组数
int []Result = new int[a]; //记录最终结果
//输入元素
for(int k = 0; k<a; k++){ //k用来记录有多少大组
int b = input.nextInt(); //记录每组数有几个元素
int [][]arr = new int[2][b];//为每个大组分配空间
for(int i=0; i<2; i++){
for(int j=0; j<b; j++){
arr[i][j] = input.nextInt();
}
}
TempResult = Cheng(arr[0],arr[1]);//若想获得二维数组某一整行的元素,可用arr[i],arr是二维数组,i代表想获得的行号
Result[k] = TempResult;
}
//输出结果
for(int i = 0; i<a; i++){
System.out.println(Result[i]);
}
}
//升序
public static void increase(int arr[]){
for(int i = 0; i<arr.length; i++){
for(int j =0; j<arr.length-i-1; j++){
if(arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//降序
public static void decrease(int arr[]){
for(int i = 0; i<arr.length; i++){
for(int j =0; j<arr.length-i-1; j++){
if(arr[j]<arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//两数组相乘
public static int Cheng(int arr[], int brr[]){
int result = 0;
increase(arr);
decrease(brr);
for(int i = 0; i<arr.length; i++){
result += arr[i]*brr[i];
}
return result;
}
}
最小乘积(基本型)
最新推荐文章于 2022-09-10 17:01:20 发布