现有两组服务器A和B,每组有多个算力不同的CPU,其中 A 是A组第个CPU的运算能力,是 B组 第个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换。 求两组服务器中,用于交换的CPU的算力,并且要求从A组服务器中选出的CPU,算力尽可能小。
第一行输入为L1和L2,以空格分隔,L1表示A组服务器中的CPU数量,L2表示B组服务器中的CPU数量
第二行输入为A组服务器中各个CPU的算力值,以空格分隔.
第三行输入为B组服务器中各个CPU的算力值,以空格分隔 1 ≤ L1, L2 ≤ 10000 1 ≤ A[i], B[i] ≤ 100000
对于每组测试数据,输出两个整数,以空格分隔,依次表示A组选出的CPU算力,B组选出的CPU算力。要求从A组选出的CPU的算力尽可能小。 备注:保证两组服务器的初始总算力不同,答案肯定存在。
示例一
输入:
2 2
1 1
2 2
输出
1 2
说明
从A组中选出算力为1的CPU,与B组中算力为2的进行交换,使两组服务器的算力都等于3
示例二
输入:
2 2
1 2
2 3
输出
1 2
示例三
输入:
1 2
2
1 3
输出
2 3
实例四
输入:
3 2
1 2 5
2 4
输出:
5 4
java题解
题解
模拟的题目
解题思路:
计算两组服务器的总算力。
根据总算力的差值,计算出需要交换的差值的一半。
遍历第一组服务器的算力,尝试在第二组服务器中找到合适的算力进行交换,使得两组服务器的总算力相等。
输出找到的交换方案。
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.IntStream;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int L1 = in.nextInt(), L2 = in.nextInt();
// A 组服务器
int[] a = IntStream.range(0, L1).map(i -> in.nextInt()).toArray();
Arrays.sort(a);
int sum1 = IntStream.of(a).sum();
// B组服务器
int sum2 = 0;
Set<Integer> b = new HashSet();
for (int i = 0; i < L2; i++) {
int t = in.nextInt();
b.add(t);
sum2 += t;
}
// A 组服务器应该减少的数量
int d = (sum1 - sum2) / 2;
for (int x : a) {
// B 组是否存在 target ,如果存在则和 target 交换即可 (交换后两组算力相等)
int target = x - d;
if (b.contains(target)) {
System.out.println(String.format("%d %d", x, x - d));
return;
}
}
}
}