目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 1、输入
- 2、输出
- 3、说明
- 4、双指针算法
- 五、Java算法源码
- 六、效果展示
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
一、题目描述
部门组织绿岛骑行团建活动,租用公共双人自行车骑行,每辆自行车最多坐两人、最大载重 M。
给出部门每个人的体重,请问最多需要租用多少双人自行车。
二、输入描述
第一行两个数字 m、n,自行车限重 m,代表部门总人数 n。
第二行,n 个数字,代表每个人的体重。体重都小于等于自行车限重 m。
0<m <= 200
0 < n <= 1000000
三、输出描述
最小需要的双人自行车数量。
四、解题思路
1、输入
7 6
3 4 5 3 3 7
2、输出
4
3、说明
- 自行车限重7
- 一共6人,按照体重排序,3 3 3 4 5 7
- 分配自行车,3 + 3 < 7,3 + 4 = 7,5 < 7,7 =7
- 故,一共4台。
4、双指针算法
- 先排序;
- 如果两人体重之和小于等于 m,则租一辆双人自行车;
- 如果两人体重之和大于 m,则租一辆单人自行车;
五、Java算法源码
/**
* 双指针
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line1 = sc.nextLine();
String line2 = sc.nextLine();
String[] split = line1.split(" ");
// 自行车限重 m
int m = Integer.parseInt(split[0]);
// 人数n
int n = Integer.parseInt(split[1]);
// 需要的自行车数量
int count = 0;
// 每个人的体重集合
String[] arr = line2.split(" ");
int[] nums = new int[arr.length];
for (int i = 0; i < nums.length; i++) {
nums[i] = Integer.parseInt(arr[i]);
}
// 按照体重排序
Arrays.sort(nums);
// 体重最轻的人
int i = 0;
// 体重最重的人
int j = nums.length - 1;
/**
* 如果两人体重之和小于等于 m,则租一辆双人自行车。
* 如果两人体重之和大于 m,则租一辆单人自行车。
*/
while (i < j) {
// 如果两个重量加起来大于m,那么右指针左移
if (nums[i] + nums[j] > m) {
j--;
count++;
} else {
i++;
j--;
count++;
}
}
// 左右指针相等时
if (i == j) {
count++;
}
System.out.println(count);
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。