题目:
现有两组服务器QA和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能
力,B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。
为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换。
求两组服务器中,用于交换的CPU的算力,并且要求从A组服务器中选出的CPU,算力尽可能
小。
输入描述
第一行输入为L1和L2,以空格分隔,L1表示A组服务器中的CPU数量,L2表示B组服务器中的
CPU数量.
第二行输入为A组服务器中各个CPU的算力值,以空格分隔。
第三行输入为B组服务器中各个CPU的算力值,以空格分隔。
1 < L1 <10000
1 <L2< 10000
1 <A[i] <100000
1 < B[i] <100000
输出描述
对于每组测试数据,输出两个整数,以空格分隔,依次表示A组选出的CPU算力,B组选出的
CPU算力。要求从A组选出的CPU的算力尽可能小。
备注:保证两组服务器的初始总算力不同,答案肯定存在
示例1:
输入:
2 2
1 1
2 2
输出:
1 2
说明
从A组中选出算力为1的CPU,与B组中算力为2的进行交换,使两组服务器的算力都等于3.
示例2:
输入:
2 2
1 2
2 3
输出
1 2
示例3:
输入:
1 2
2
1 3
输出
2 3
示例4:
输入:
3 2
1 2 5
2 4
输出:
5 4
思路:
相对比较简单,因为题目说了一定存在,那么将A组CPU 转为list,然后排序
算出A,B两组性能差距sum(A)-sum(B),然后按A,B循环遍历,找到cpuB-cpuA = (sum(A)-sum(B))/2的两个cpu,值输出就可以了
代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;public class SwitchCpu {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] cpuNums = sc.nextLine().split(" ");int cpu1 = Integer.valueOf(cpuNums[0]);int cpu2 = Integer.valueOf(cpuNums[1]);String[] cpu1s = sc.nextLine().split(" ");List<Integer> cpuOne = new ArrayList<>();int totalCpuOne = 0;for(int i=0;i<cpu1s.length;i++){cpuOne.add(Integer.valueOf(cpu1s[i]));totalCpuOne +=cpuOne.get(i);}String[] cpu2s = sc.nextLine().split(" ");int[] cpuTwo = new int[cpu1s.length];int totalCpuTwo = 0;for(int i=0;i<cpu2s.length;i++){cpuTwo[i] = Integer.valueOf(cpu2s[i]);totalCpuTwo +=cpuTwo[i];}Collections.sort(cpuOne);int dis = totalCpuTwo - totalCpuOne;//题目里面说必然存在 那么dis 必然是偶数 否则totalCpuTwo+totalCpuOne 就是奇数了,不可能存在符合条件的方案int changeCpuOne = 0;int changeCpuTwo = 0;for(int i = 0;i<cpuOne.size();i++){for(int j =0;j<cpuTwo.length;j++){if(cpuTwo[j]-cpuOne.get(i) == dis/2){changeCpuOne = cpuOne.get(i);changeCpuTwo = cpuTwo[j];break;}}}System.out.println(changeCpuOne+" "+changeCpuTwo);}
}
验证: