调整数组使差最小
Description
有两个序列 a,b,大小都为 n,序列元素的值任意整数,无序; 要求:通过交换 a,b 中的元素,使[序列 a 元素的和]与[序列 b 元素的和]之间的差最小。
Input
输入第一行为用例个数, 每个测试用例输入为两行,分别为两个数组,每个值用空格隔开。
Output
输出变化之后的两个数组内元素和的差绝对值。
Sample Input 1
1
100 99 98 1 2 3
1 2 3 4 5 40
Sample Output 1
48
编码思路
- 通过交换a,b中的元素使得之间差值最小,由于无法确定交换个数,所以需要尝试每次交换的个数
- 当然只需要从1尝试 num/2就一样 因为 C61=C65。也就是说在数组有6个数的情况下,交换一个数和交换5个数的情况是一样的
- 比如交换数为2.本次没有列出在选出2个数的情况,而是直接算出两个数的值
- 想让差最小 举个例子
数组1 arr1=[…,…,…]
数组2 arr2=[…,…,…]
sum(arr1)-sum(arr2)=cha
此时交换数为2
arr1 找出两个数 a1,a2 a1+a2=A
arr2找出两个数 b1,b2 b1+b2=B
在交换后 最新的差值 为 sum(arr1)-A+B -(sum(arr2)—B+A)=cha-2(A-B)让这个值的绝对值最小即可
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class k8 {
/*
* 1
100 99 98 1 2 3
1 2 3 4 5 40 48
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// Scanner sc=new Scanner(System.in);
// int times = Integer.parseInt(sc.nextLine());
// while(times>0) {
//
// String fir=sc.nextLine();
// String sec=sc.nextLine();
// String[] firArr=fir.split(" ");
// String[] secArr=sec.split(" ");
// int[] arr1=new int[firArr.length];
// int[] arr2=new int[secArr.length];
// for(int i=0;i<arr1.length;i++) {
// arr1[i]=Integer.parseInt(firArr[i]);
// }
// for(int i=0;i<arr2.length;i++) {
// arr2[i]=Integer.parseInt(secArr[i]);
// }
//
// minCha(arr1,arr2);
// times--;
// }
int[] arr1= {
1,3,4,5};
int[] arr2= {
8,9,19,21};
minCha(arr1,arr2);
}
//找出最终结果
public static void minCha(int[]arr1,int []arr2) {
//分别算出