目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、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卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。