算法训练 最小乘积(基本型) 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.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
	
	public static void main(String[] args) {
		ArrayList alist1 = new ArrayList(); 	
		ArrayList alist2 = new ArrayList();		
		int b = 0; 
		Scanner sc = new Scanner(System.in);
		
		int t = sc.nextInt(); //t组数据
	
		
		int[] result = new int[1001];  //因为t小于等于1000
		
		for(int i=1 ; i<=t ; i++){  //分组输入  
			int n = sc.nextInt(); 		//定义每组一行有多少个元素
			for(int x=1 ; x<=2 ; x++){	//分两行输入
				
				for(int y=0 ; y<n ; y++){		//n个元素顺序输入
					alist1.add(sc.nextInt());  //直接将两行的数据输入到alist1中
				}
				
			}
			
			for(int x=n ; x<2*n ; x++){			
				alist2.add(alist1.get(x));   //将alist1中的第n个到最后一个数据元素顺序添加到alist2中,即第二行的数据
				
			}
			
			
			for(int x=n ; x<=2*n-1 ; x++){
			
				alist1.remove(n);			//将alist1中第n个到最后一个数据元素都删除,即剩余第一行的数据
			}
			Collections.sort(alist1);		//将alist1排序
			Collections.sort(alist2);		//将alist2排序
			Collections.reverse(alist2);	//将alist2呈倒序
			
			
			for(int y=0 ; y<n ; y++){
				b += (int)(alist1.get(y))*(int)(alist2.get(y));//两个数组的相同下标的数据元素相乘
			}
			result[i]=b;	//将乘积的和赋值给result数组 因为不一定只有一组数据
			//清楚数据后进行第下一组数据的计算
			alist1.clear();
			alist2.clear();
			b=0;
		}
		//输出每组数据的结果
		for(int i=1 ; i<=t ; i++){
			System.out.println(result[i]);
		}
	}
}

测试点只有一个  但是测试数据有1000组   。。。


算法训练 最小乘积(基本型) java蓝桥杯_第1张图片


你可能感兴趣的:(java,ArrayList,java算法,蓝桥杯)