試題 算法訓練 最小乘積(基本型)
資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
給兩組數,各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
//解題思路:得到最小值是二個數組中一個數組最大值乘另一個數組最小值
package Main;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//接收有多少相乘的成對數組
int n=scanner.nextInt();
//接收相乘的成對數組最小數
int[] summin=new int[n];
for (int i = 0; i < n; i++) {
//接收相乘的成對數組長度
int s=scanner.nextInt();
//接收相乘的成對數組第一組
int[] a=new int[s];
//接收相乘的成對數組第二組
int[] b=new int[s];
for (int j = 0; j <s; j++) {
a[j]=scanner.nextInt();
}
for (int j = 0; j <s; j++) {
b[j]=scanner.nextInt();
}
for (int j2 = 0; j2 < s; j2++) {
for (int k = 0; k <s-1; k++) {
//相乘的成對數組第一組進行從大到小排列
if(a[k+1]>a[k]) {
int aa=a[k];
a[k]=a[k+1];
a[k+1]=aa;
}
//相乘的成對數組第二組進行從小到大排列
if(b[k+1]<b[k]) {
int bb=b[k];
b[k]=b[k+1];
b[k+1]=bb;
}
}
}
int sum=0;
//對排序的a,b數組進行相乘
for (int j = 0; j < s; j++) {
sum=sum+a[j]*b[j];
}
summin[i]=sum;
}
//輸出結果
for (int i = 0; i <n; i++) {
System.out.println(summin[i]);
}
scanner.close();
}
}