通过率 66% · 提交 355 · 通过 235
部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,最大载重M。 给出部门每个人的体重,请问最多需要租用多少双人自行车。
这类题属于华为 OD 机考真题方向中「100分 / 排序」方向的高频题型,通常考察对「100分 / 排序」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行两个数字m、n,分别代表自行车限重,部门总人数。 第二行,n个数字,代表每个人的体重,体重都小于等于自行车限重m。 0<m<=200 0<n<=1000000
最小需要的双人自行车数量。
示例 1
输入示例
3 4 3 2 2 1
输出示例
3
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
注意,本题和 救生艇 完全一致,甚至连示例都和原题里的示例二一致。
整个题目的贪心思想,其实可以用一句话解释清楚: 当我们考虑一个较轻的人时,我们总是贪心地想让它和一个较重的人进行配对。
因为如果是两个较轻的人组队,那么可能会出现重的人无法配对的情况,从而减少了分组数。 因此我们希望尽量使用 一轻一重 这样的搭配,来使得每一组的剩余空间尽可能少,从而使得分组数尽可能地多。
因此 排序 + 贪心 + 双指针 的策略就呼之欲出了。
思路展开 先把所有人的体重从小到大排序,再设置一对相向而行的双指针:left 指向当前最轻的人,right 指向当前最重的人,ans 记录已经派出的船数。每一轮循环只做一个判断:
之所以总让最重的人优先尝试带上最轻的人,是因为如果连最轻的人都带不动,那换任何人都带不动,最重的人必然单独坐船;而如果带得动,让他带走最轻的人,剩下的人两两配对的余地只会更大、不会更差。循环条件是 left <= right,取等号保证中间剩下最后一个人时,他也会单独占一条船。循环结束时每个人都恰好被安排过一次,ans 即最少船数。
复杂度分析 设 n 为人数。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有