[华为OD] C卷 服务器cpu交换 现有两组服务器QA和B,每组有多个算力不同的CPU 100

题目:

现有两组服务器QA和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组CPU 转为list,然后排序

算出A,B两组性能差距sum(A)-sum(B),然后按A,B循环遍历,找到cpuB-cpuA = (sum(A)-sum(B))/2的两个cpu,值输出就可以了

代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class SwitchCpu {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] cpuNums = sc.nextLine().split(" ");
        int cpu1 = Integer.valueOf(cpuNums[0]);
        int cpu2 = Integer.valueOf(cpuNums[1]);
        String[] cpu1s = sc.nextLine().split(" ");
        List<Integer> cpuOne = new ArrayList<>();
        int totalCpuOne = 0;
        for(int i=0;i<cpu1s.length;i++){
            cpuOne.add(Integer.valueOf(cpu1s[i]));
            totalCpuOne +=cpuOne.get(i);
        }

        String[] cpu2s = sc.nextLine().split(" ");
        int[] cpuTwo = new int[cpu1s.length];
        int totalCpuTwo = 0;
        for(int i=0;i<cpu2s.length;i++){
            cpuTwo[i] = Integer.valueOf(cpu2s[i]);
            totalCpuTwo +=cpuTwo[i];
        }

        Collections.sort(cpuOne);

        int dis = totalCpuTwo - totalCpuOne;
        //题目里面说必然存在 那么dis 必然是偶数 否则totalCpuTwo+totalCpuOne 就是奇数了,不可能存在符合条件的方案
        int changeCpuOne = 0;
        int changeCpuTwo = 0;
        for(int i = 0;i<cpuOne.size();i++){
            for(int j =0;j<cpuTwo.length;j++){
                if(cpuTwo[j]-cpuOne.get(i) == dis/2){
                    changeCpuOne = cpuOne.get(i);
                    changeCpuTwo = cpuTwo[j];
                    break;
                }
            }
        }

        System.out.println(changeCpuOne+" "+changeCpuTwo);

    }
}

验证:

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值