2024年华为OD机试真题-CPU算力分配

华为OD机试真题-CPU算力分配-2024年OD统一考试(D卷)

题目描述:

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

说明:

解题思路:

题目较长,但仔细阅读后,发现就是考察数组。

Java解法:

import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        String[] L = scanner.nextLine().split(" ");
        int L1 = Integer.parseInt(L[0]);
        int L2 = Integer.parseInt(L[1]);
        
        String[] A = scanner.nextLine().split(" ");
        String[] B = scanner.nextLine().split(" ");
        
        int suma = 0;
        int sumb = 0;
        
        for (String num : A) {
            suma += Integer.parseInt(num);
        }
        
        for (String num : B) {
            sumb += Integer.parseInt(num);
        }
        
        int ava = (suma + sumb) / 2;
        int value = Math.abs(ava - suma);
        
        Arrays.sort(A);
        Arrays.sort(B);
        
        if (suma > sumb) {
            for (String item : A) {
                if (Arrays.binarySearch(B, String.valueOf(Integer.parseInt(item) - value)) >= 0) {
                    System.out.println(item + " " + (Integer.parseInt(item) - value));
                    break;
                }
            }
        } else {
            for (String item : A) {
                if (Arrays.binarySearch(B, String.valueOf(value + Integer.parseInt(item))) >= 0) {
                    System.out.println(item + " " + (value + Integer.parseInt(item)));
                    break;
                }
            }
        }
    }
}

Python解法:

import sys
 
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()
# print(value, suma, sumb)
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
 

C++解法:

#include <stdio.h>
 
int main()
{
    int L1=0;
    int L2=0;
    scanf("%d %d",&L1,&L2);
    int A[100000]={0};
    int B[100000]={0};
    int i=0;
    int j=0;
    int flag=0;
    int a=0;
    int b=0;
    int sum_A=0;
    int sum_B=0;
    for(i=0;i<L1;i++)
    {
        scanf("%d",&A[i]);
        sum_A+=A[i];
    }
    for(i=0;i<L2;i++)
    {
        scanf("%d",&B[i]);
        sum_B+=B[i];
    }
    for(i=0;i<L1;i++)
    {
        for(j=0;j<L2;j++)
        {
            if(A[i]!=B[j])
            {
                if((sum_A+B[j]-A[i])==(sum_B+A[i]-B[j]))
                {
                    if(flag==0)
                    {
                        a=A[i];
                        b=B[j];
                        flag=1;
                    }
                    else if(a>A[i]&&flag==1)
                    {
                        a=A[i];
                        b=B[j];
                    }
                }
            }
        }
    }
    printf("%d %d\n",a,b);
    return 0;
}

欢迎交流指正~

#华为od##华为#
华为OD机试题库2024年 文章被收录于专栏

2024年OD统一考试(D卷),最新最完整题库。 收录130+道真题,提供解题思路,Java/Python/C++三种答案源码。

全部评论
言简意赅
1
送花
回复 分享
发布于 06-25 12:47 上海

相关推荐

6 9 评论
分享
牛客网
牛客企业服务