全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:租车骑绿道
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。
给出部门每个人的体重,请问最多需要租用多少双人自行车。
输入描述:
第一行两个数字m、n,自行车限重m,代表部门总人数n。
第二行,n个数字,代表每个人的体重。体重都小于等于自行车限重m。
0 < m <= 200
0 < n <= 1000000
输出描述:
最小需要的双人自行车数量。
示例1
输入:
3 4
3 2 2 1
输出:
3
解题思路:
对部门人员按照体重进行降序排序。
对人员进行遍历。
如例1:
排序后为 3 2 2 1
1、3 等于承重3,则单独一辆 count = 1;
2、2 小于3,继续向前找,2+2=4不符合,继续向前找,2+1=3等于3,符合,1已经用过了需要置为0,count+1 = 2;
3,、2 小于3,向前找,只剩刚才处理过的0,遍历结束。结果count+1=3;
代码实现一:
package com.codernav.demo.hwod.exam; import java.util.Arrays; import java.util.Scanner; /** * @title 租车骑绿道 * @Description 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 * 给出部门每个人的体重,请问最多需要租用多少双人自行车。 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/14 */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); int[] weight = new int[n]; for (int i = 0; i < n; i++) { weight[i] = sc.nextInt(); } Arrays.sort(weight); //对体重进行排序,方便安排 int res = 0; for (int i = weight.length - 1; i >= 0; i--) { if (weight[i] == 0) { //等于0则代表已经有车了 continue; } if (weight[i] == m) { //一人一辆车 res++; continue; } for (int j = i - 1; j >= 0; j--) { if (weight[j] != 0 && weight[i] + weight[j] <= m) { //因为已经排过序,遇到合适的就上车 weight[j] = 0; break; } } res++; } System.out.println(res); } }
代码实现二:Java代码满分实现
package com.codernav.demo.hwod.exam; import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; /** * @title 租车骑绿道 * @Description 部门组织绿道骑行团建活动。租用公共双人自行车骑行,每辆自行车最多坐两人、做大载重M。 * 给出部门每个人的体重,请问最多需要租用多少双人自行车。 * @Author 开发者导航 * @website https://codernav.com * @date 2023/5/14 */ public class Main { public static void main(String[] args) { //处理输入 Scanner in = new Scanner(System.in); int m = in.nextInt(); int n = in.nextInt(); ArrayList<Integer> weights = new ArrayList<Integer>(); for (int i = 0; i < n; i++) { int a = in.nextInt(); weights.add(a); //System.out.println(s); } Collections.sort(weights); //第二步,左右指针向中间移动 int left = 0; int right = weights.size() - 1; //结果 int min_bikes = 0; //当前重量 int temp_weight = weights.get(right) + weights.get(left); // 题目中有两个隐含的条件 // 1: 一辆车最多骑两个人 // 2:人的重量不可能大于车的载重 while (left < right) { if (temp_weight > m) { right--; min_bikes += 1; temp_weight = weights.get(right) + weights.get(left); } else { right--; left++; min_bikes += 1; temp_weight = weights.get(right) + weights.get(left); } } if (left == right) { min_bikes++; } System.out.println(min_bikes); } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...