题目描述
现有两组服务器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的算力尽可能小。
补充说明:
保证两组服务器的初始总算力不同。
答案肯定存在。
示例1
输入:
2 2
1 1
2 2
输出:
1 2
说明:
从A组中选出算力为1的CPU,与B组中算力为2的进行交换,使两组服务器的算力都等于3。
示例2
输入:
2 2
1 2
2 3
输出:
1 2
示例3
输入:
1 2
2
1 3
输出:
2 3
示例4
输入:
3 2
1 2 5
2 4
输出:
5 4
解题思路
- 对A组和B组的CPU算力进行排序,从小到大。 用两个指针分别指向A组和B组的算力数组的起始位置。
- 使用一个变量diff记录A组和B组总算力之差,初始化为A组总算力减去B组总算力。
- 循环遍历,比较当前两个指针位置的算力之差与diff的绝对值,更新diff和对应的CPU算力。
- 当diff为0时,找到了一对满足条件的CPU,输出即可。
题解代码
对不起,看起来是有一些误解。提供的代码是Python的实现,而且似乎并没有提供其他语言的具体实现。如果你需要其他语言的实现,可以选择将Python代码转换为相应语言的语法结构。以下是可能的转换:
Python 题解代码
L = input().split()
L1, L2 = int(L[0]), int(L[1])
A = list(map(int, input().split()))
B = list(map(int, input().split()))suma = sum(A)
sumb = sum(B)
ava = int((suma + sumb) / 2)
value = abs(ava - sum(A))
A.sort()
B.sort()if suma > sumb:for item in A:if (item - value) in B:print(item, item - value)break
else:for item in A:if (value + item) in B:print(item, value + item)break
Java 题解代码
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int L1 = scanner.nextInt();int L2 = scanner.nextInt();int[] A = new int[L1];int[] B = new int[L2];for (int i = 0; i < L1; i++) {A[i] = scanner.nextInt();}for (int i = 0; i < L2; i++) {B[i] = scanner.nextInt();}int suma = Arrays.stream(A).sum();int sumb = Arrays.stream(B).sum();int ava = (suma + sumb) / 2;int value = Math.abs(ava - Arrays.stream(A).sum());Arrays.sort(A);Arrays.sort(B);if (suma > sumb) {for (int item : A) {if (Arrays.binarySearch(B, item - value) >= 0) {System.out.println(item + " " + (item - value));break;}}} else {for (int item : A) {if (Arrays.binarySearch(B, item + value) >= 0) {System.out.println(item + " " + (item + value));break;}}}}
}
C++ 题解代码
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {int L1, L2;cin >> L1 >> L2;vector<int> A(L1);vector<int> B(L2);for (int i = 0; i < L1; i++) {cin >> A[i];}for (int i = 0; i < L2; i++) {cin >> B[i];}int suma = accumulate(A.begin(), A.end(), 0);int sumb = accumulate(B.begin(), B.end(), 0);int ava = (suma + sumb) / 2;int value = abs(ava - accumulate(A.begin(), A.end(), 0));sort(A.begin(), A.end());sort(B.begin(), B.end());if (suma > sumb) {for (int item : A) {if (binary_search(B.begin(), B.end(), item - value)) {cout << item << " " << item - value << endl;break;}}} else {for (int item : A) {if (binary_search(B.begin(), B.end(), item + value)) {cout << item << " " << item + value << endl;break;}}}return 0;
}
JavaScript 题解代码
const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});rl.on('line', (line) => {const [L1, L2] = line.split(' ').map(Number);rl.on('line', (lineA) => {const A = lineA.split(' ').map(Number);rl.on('line', (lineB) => {const B = lineB.split(' ').map(Number);const suma = A.reduce((acc, val) => acc + val, 0);const sumb = B.reduce((acc, val) => acc + val, 0);const ava = Math.floor((suma + sumb) / 2);const value = Math.abs(ava - A.reduce((acc, val) => acc + val, 0));A.sort((a, b) => a - b);B.sort((a, b) => a - b);if (suma > sumb) {for (const item of A) {if (B.includes(item - value)) {console.log(`${item} ${item - value}`);break;}}} else {for (const item of A) {if (B.includes(item + value)) {console.log(`${item} ${item + value}`);break;}}}rl.close();});});
});
这些是对提供的Python代码进行Java、C++和JavaScript语言的转换。注意,JavaScript代码使用了Node.js中的readline模块进行输入处理。
代码OJ评判结果
代码讲解
Python 题解代码讲解
这段 Python 代码解决了两组服务器 A 和 B,通过选取一对 CPU 进行交换,使得两组服务器的总算力相等。
-
输入处理:
- 获取输入的两组服务器 CPU 的数量和算力。
- 将输入的算力转换为整数列表。
-
计算总算力和平均算力:
- 计算 A 组和 B 组的总算力分别为
suma
和sumb
。 - 计算平均算力
ava
为(suma + sumb) / 2
。
- 计算 A 组和 B 组的总算力分别为
-
寻找交换的 CPU 算力:
- 计算差值
value
为abs(ava - sum(A))
,即平均算力与 A 组总算力的差值。 - 对 A 组和 B 组的算力数组进行排序。
- 如果 A 组总算力大于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 如果 A 组总算力小于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 计算差值
-
输出结果:
- 输出找到的两个 CPU 的算力,以空格分隔。
Java 题解代码讲解
这是 Java 代码的简要讲解:
-
输入处理:
- 使用 Scanner 获取输入的两组服务器 CPU 的数量和算力。
- 将输入的算力转换为整数数组。
-
计算总算力和平均算力:
- 计算 A 组和 B 组的总算力分别为
suma
和sumb
。 - 计算平均算力
ava
为(suma + sumb) / 2
。
- 计算 A 组和 B 组的总算力分别为
-
寻找交换的 CPU 算力:
- 计算差值
value
为Math.abs(ava - Arrays.stream(A).sum())
,即平均算力与 A 组总算力的差值。 - 对 A 组和 B 组的算力数组进行排序。
- 如果 A 组总算力大于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 如果 A 组总算力小于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 计算差值
-
输出结果:
- 输出找到的两个 CPU 的算力,以空格分隔。
C++ 题解代码讲解
这是 C++ 代码的简要讲解:
-
输入处理:
- 使用 cin 获取输入的两组服务器 CPU 的数量和算力。
- 将输入的算力转换为整数数组。
-
计算总算力和平均算力:
- 计算 A 组和 B 组的总算力分别为
suma
和sumb
。 - 计算平均算力
ava
为(suma + sumb) / 2
。
- 计算 A 组和 B 组的总算力分别为
-
寻找交换的 CPU 算力:
- 计算差值
value
为abs(ava - accumulate(A.begin(), A.end(), 0))
,即平均算力与 A 组总算力的差值。 - 对 A 组和 B 组的算力数组进行排序。
- 如果 A 组总算力大于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 如果 A 组总算力小于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 计算差值
-
输出结果:
- 输出找到的两个 CPU 的算力,以空格分隔。
JavaScript 题解代码讲解
这是 JavaScript 代码的简要讲解:
-
输入处理:
- 使用 readline 模块获取输入的两组服务器 CPU 的数量和算力。
- 将输入的算力转换为整数数组。
-
计算总算力和平均算力:
- 计算 A 组和 B 组的总算力分别为
suma
和sumb
。 - 计算平均算力
ava
为Math.floor((suma + sumb) / 2)
。
- 计算 A 组和 B 组的总算力分别为
-
寻找交换的 CPU 算力:
- 计算差值
value
为Math.abs(ava - A.reduce((acc, val) => acc + val, 0))
,即平均算力与 A 组总算力的差值。 - 对 A 组和 B 组的算力数组进行排序。
- 如果 A 组总算力大于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 如果 A 组总算力小于 B 组总算力,循环遍历 A 组,找到一个 CPU,使得与 B 组中的某个 CPU 交换后,两组服务器的总算力相等。
- 计算差值
-
输出结果:
- 输出找到的两个 CPU 的算力,以空格分隔。
希望这些简要的讲解对你有帮助。如果有其他问题,请随时提出。
寄语
🚀✨ 朋友,希望你的华为OD机试就像是一场轻松的技术party!愿你的代码如同畅快的音符,跳跃在键盘上,最后弹奏出一曲高分之歌。加油,你是技术舞台上的巨星!通过机试,就像是风轻云淡,轻轻松松就把高分收入囊中。祝愿你的编程之旅一路顺风,破风前行,每一行代码都是成功的注脚!🌈💻