题目描述:
现有两组服务器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]<=10000 输出描述: 对于每组测试数据,输出两个整数,以空格分隔,依次表示A组选出的CPU算力、B组选出的CPU算力。 要求从A组选出的CPU的算力尽可能小。 补充说明: 保证两组服务器的初始总算力不同。答案肯定存在。 示例1 输入: 2 2 1 1 2 2 输出: 1 2 说明: 从A组中选出算力为1的CPU,与B组中算力为2的进行交换口
解题思路:
1、计算两组的总算力:
计算A组所有CPU的总算力 sumA;计算B组所有CPU的总算力 sumB。
2、计算需要交换的目标差值:
如果我们从A组中选择一个CPU a 和从B组中选择一个CPU b 进行交换,
那么交换后两组的总算力会变为sumA - a + b 和 sumB - b + a。
要使交换后的两组总算力相等,必须满足:sumA - a + b = sumB - b + a
经过整理,得到:2a - 2b = sumA - sumB
进一步简化为:a - b = {sumA - sumB}/2 设这个差值为 delta
则有 a - b = delta。
3、寻找符合条件的CPU对:
我们需要寻找A组中的某个CPU a 和B组中的某个CPU b,使得 a - b = delta。
4、保证A组CPU的算力尽可能小:
优先从A组中找出满足条件的最小的a
代码部分
def find_cou_pairs(A, B):
sumA = sum(A)
sumB = sum(B)
delta = (sumA - sumB) // 2
B_set = set(B) #集合避免相等算力重复对比
"""
题目要求从A组中找出满足条件的最小的a
故将A升序排序后,由小到大遍历,寻找对应b
"""
for a in sorted(A):
b = a - delta
if b in B_set:
return a, b
L1, L2 = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
a, b = find_cou_pairs(A, B)
print(a, b)
涉及知识点:列表
主要考察将其转化为数学问题的能力
结语:越简单的题目解法应该越多,请路过大神留下新的思路供本小白学习一下,打开思路