CPU算力分配 - 华为OD统一考试
OD统一考试
题解: Java / Python / C++
题目描述
现有两组服务器A和B,每组有多个算力不同的CPU,其中 A 是A组第个CPU的运算能力,是 B组 第个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换。 求两组服务器中,用于交换的CPU的算力,并且要求从A组服务器中选出的CPU,算力尽可能小。
输入描述
第一行输入为L1和L2,以空格分隔,L1表示A组服务器中的CPU数量,L2表示B组服务器中的CPU数量
第二行输入为A组服务器中各个CPU的算力值,以空格分隔.
第三行输入为B组服务器中各个CPU的算力值,以空格分隔 1 ≤ L1, L2 ≤ 10000 1 ≤ A[i], 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
题解
模拟的题目
解题思路:
- 计算两组服务器的总算力。
- 根据总算力的差值,计算出需要交换的差值的一半。
- 遍历第一组服务器的算力,尝试在第二组服务器中找到合适的算力进行交换,使得两组服务器的总算力相等。
- 输出找到的交换方案。
Java
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.IntStream;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int L1 = in.nextInt(), L2 = in.nextInt();
// A 组服务器
int[] a = IntStream.range(0, L1).map(i -> in.nextInt()).toArray();
Arrays.sort(a);
int sum1 = IntStream.of(a).sum();
// B组服务器
int sum2 = 0;
Set<Integer> b = new HashSet();
for (int i = 0; i < L2; i++) {
int t = in.nextInt();
b.add(t);
sum2 += t;
}
// A 组服务器应该减少的数量
int d = (sum1 - sum2) / 2;
for (int x : a) {
// B 组是否存在 target ,如果存在则和 target 交换即可 (交换后两组算力相等)
int target = x - d;
if (b.contains(target)) {
System.out.println(String.format("%d %d", x, x - d));
return;
}
}
}
}
Python
L1, L2 = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
a.sort()
sum1, sum2 = sum(a), sum(b)
d = (sum1 - sum2) // 2
b_set = set(b)
for x in a:
target = x - d
if target in b_set:
print(x, target, sep=" ")
break
C++
#include <vector>
#include <algorithm>
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
int L1, L2;
int sum1 = 0, sum2 = 0;
cin >> L1 >> L2;
// A 组服务器
vector<int> a(L1);
for(int& t : a) {
cin >> t;
sum1 += t;
}
// B 组服务器
unordered_set<int> b;
for(int i = 0, t = 0; i < L2; i++) {
cin >> t;
b.insert(t);
sum2 += t;
}
sort(a.begin(), a.end());
// A 组服务器应该减少的数量
int d = (sum1 - sum2) / 2;
for(int x : a) {
int target = x - d;
// B 组是否存在 target ,如果存在则和 target 交换即可 (交换后两组算力相等)
if(b.count(target)) {
cout << x << ' ' << target << endl;
return 0;
}
}
return 0;
}
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
#秋招##校招##面经##笔经##华为#