华为OD机试真题 - CPU算力分配 (D卷,100分)
题目描述
现有两组服务器A和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的算力尽可能小。
备注
- 保证两组服务器的初始总算力不同。
- 答案肯定存在
用例
题目解析
- 首先,计算A组服务器的算力总和sum_A和B组服务器的算力总和sum_B。
- 然后,遍历A组服务器中的每个CPU,计算将该CPU与B组服务器中任意一个CPU交换后,两组服务器的算力之差。
- 在遍历过程中,记录最小的算力差值min_diff以及对应的A组和B组选出的CPU算力。
- 最后,输出A组选出的CPU算力和B组选出的CPU算力。
JS算法源码
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void (async function () { while (true) { try { const [l1, l2] = (await readline()).split(" ").map(Number); const A = (await readline()).split(" ").map(Number); const B = (await readline()).split(" ").map(Number); let sumA = 0; for (let a of A) { sumA += a; } let sumB = 0; const setB = new Set(); for (let b of B) { sumB += b; setB.add(b); } const half_diff = (sumA - sumB) / 2; let minA = Infinity; let ans = ""; for (let a of A) { const b = a - half_diff; if (setB.has(b)) { if (a < minA) { minA = a; ans = `${a} ${b}`; } } } console.log(ans); } catch (e) { break; } } })();
Java算法源码
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { String[] input = br.readLine().split(" ");
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2024华为OD机试题库D卷 文章被收录于专栏
2024年5-11月份考的D卷,不用再看AB卷,CD卷题目一样。多种语言解法,欢迎提供更好的解法。