华为OD机试 - 数字序列比大小 - 贪心算法(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

一、题目描述

A,B两个人万一个数字比大小的游戏,在游戏前,两个人会拿到相同长度的两个数字序列,两个数字序列不相同且其中的数字是随机的。

A,B各自从数字序列中挑选出一个数字进行大小比较,赢的人得1分,输的人扣1分,相等则各自的分数不变,用过的数字需要丢弃。

求A可能赢B的最大分数。

二、输入描述

输入数据的第一个数字表示数字序列的长度N,后面紧跟着两个长度为N的数字序列。

三、输出描述

A可能赢B的最大分数。

这里要求计算A可能赢B的最大分数,不妨假设,A知道B的数字序列,且总是B先挑选数字并明示;

可以采用贪心策略,能赢的一定要赢,要输的尽量减少损失。

四、解题思路

这是典型的田忌赛马问题,首先将两个序列排序,然后遍历序列A,每次找到序列B中比A[i]小的数字中最大的数字即可。

五、Java算法源码

/**
 * 田忌赛马,永远比你大,你服不服?
 */
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 数字序列的长度
    int N = Integer.parseInt(sc.nextLine());
    // 数字序列A
    int[] A = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    // 数字序列B
    int[] B = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

    // 排序
    Arrays.sort(A);
    Arrays.sort(B);

    // 序列A最小值下角标
    int left_a = 0;
    // 序列A最大值下角标
    int right_a = N - 1;

    // 序列B最小值下角标
    int left_b = 0;
    // 序列B最大值下角标
    int right_b = N - 1;

    // A可能赢B的最大分数
    int max = 0;

    // 遍历序列A
    while (left_a <= right_a) {
        // 赢的人得1分
        if (A[right_a] > B[right_b]) {
            max += 1;
            right_a--;
            right_b--;
            // 输的人得1分
        } else if (A[right_a] < B[right_b]) {
            max -= 1;
            left_a++;
            right_b--;
        } else {//相等则各自分数不变
            if (A[left_a] > B[left_b]) {
                max += 1;
                left_a++;
                left_b++;
            } else {
                if (B[right_b] > A[left_a]) {
                    max -= 1;
                }
                left_a++;
                right_b--;
            }
        }
    }

    System.out.println(max);
}

六、效果展示

1、输入

3
7 5 9
4 6 8

2、输出

3

3、说明

  • 7比6大得一分;
  • 5比4大得一分;
  • 9比8大得一分;

田忌赛马,永远比你大,你服不服?
华为OD机试 - 数字序列比大小 - 贪心算法(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,贪心算法,七日集训,送书,学习方法)