目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、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());// 数字序列Aint[] A = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();// 数字序列Bint[] 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;// 遍历序列Awhile (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卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。