题目描述
现有两组服务器A
和B
,每组有多个算力不同的CPU,其中Ai
是A
组第i
个CPU的运算能力,Bi
是B
组第i
个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。
为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,并且要求从A
组服务器中选出的CPU,算力尽可能小。
输入描述
第一行输入为L1
和L2
,以空格分隔,L1
表示A
组服务器中的CPU数量,L2
表示B
组服务器中的CPU数量
第二行输入为A
组服务器中各个CPU的算力值,以空格分隔。
第三行输入为B
组服务器中各个CPU的算力值,以空格分隔。
输出描述
对于每组测试数据,输出两个整数,以空格分隔,依次表示A
组选出的CPU算力、B
组选出的CPU算力,要求从A
组选出的CPU的算力尽可能小。
补充说明
保证两组服务器的初始总算力不同,答案肯定存在。
输入
2 2
1 1
2 2
输出
1 2
思路:
A组少了一个`A[i]`多了一个`B[j]`,故交换前后的变化量为sumA_new - sumA = B[j] - A[i]
nA, nB = map(int, input().split())
# 输入A组的情况
A = list(map(int, input().split()))
# 输入B组的情况
B = list(map(int, input().split()))
# 原A组的总和
sumA = sum(A)
# 原B组的总和
sumB = sum(B)
# 交换后A组的和,为所有元素总和的一半
sumA_new = (sumA + sumB) // 2
# setA的作用是去重,setB的作用是快速查找
setA = set(A)
setB = set(B)
# 找到所有满足sumA_new - sumA + Ai位于setB中的Ai的最小值,即为A组中所选的算力ansA
ansA = min(Ai for Ai in setA if (sumA_new - sumA + Ai) in setB)
# 对应地可以计算出ansB
ansB = sumA_new - sumA + ansA
# 输出答案
print(ansA, ansB)