CPU算力分配 - 华为OD统一考试

OD统一考试

题解: Java / Python / C++

alt

题目描述

现有两组服务器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

题解

模拟的题目

解题思路:

  1. 计算两组服务器的总算力。
  2. 根据总算力的差值,计算出需要交换的差值的一半。
  3. 遍历第一组服务器的算力,尝试在第二组服务器中找到合适的算力进行交换,使得两组服务器的总算力相等。
  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;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#秋招##校招##面经##笔经##华为#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-21 17:59
点赞 评论 收藏
分享
06-05 19:46
已编辑
武汉大学 后端
点赞 评论 收藏
分享
06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
评论
3
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务