【华为OD】2024D卷——CPU算力分配

题目描述:
现有两组服务器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)

涉及知识点:列表

主要考察将其转化为数学问题的能力


结语:越简单的题目解法应该越多,请路过大神留下新的思路供本小白学习一下,打开思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值