天天看點

算法訓練 最小乘積(基本型)(java)

問題描述

給兩組數,各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
           

解題思路

本題主要考察對題目的觀察分析能力,由題目給出的樣例可知:當最大數依次乘以最小數累加時,所得的累加和最小,是以我們需要通過對數組排序的方式依次讓大數乘以小數求和求得結果。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();//指定次數
		while(n!=0){
			int n1 = sc.nextInt();//定義第一個數組個數
			int arr11[] = new int[n1];//建立兩個相應數組用于存放資料
			int arr12[] = new int[n1];
				for (int i = 0; i < arr11.length; i++) {
					arr11[i] = sc.nextInt();
				}
				for (int i = 0; i < arr12.length; i++) {
					arr12[i] = sc.nextInt();
				}
				Arrays.sort(arr11);
				Arrays.sort(arr12);//對兩個數組進行排序
				//最大數乘以最小數即為最小值
				int index = arr12.length-1;
				int num1 = 0;
				for (int i = 0; i < arr12.length; i++) {
					num1=num1+(arr11[i]*arr12[index]);
					index--;
				}
				System.out.println(num1);
				num1=0;//需要将結果清零,之前一直錯誤的問題就出現在這裡!
				n--;
		}
			
	}

}

           
算法訓練 最小乘積(基本型)(java)
下一篇: 8.1 enum類型