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++三种答案源码。