题目描述
部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,最大载重M。
给出部门每个人的体重,请问最多需要租用多少双人自行车。
输入描述
第一行两个数字m、n,分别代表自行车限重,部门总人数。
第二行,n个数字,代表每个人的体重,体重都小于等于自行车限重m。
0<m<=200
0<n<=1000000
输出描述
最小需要的双人自行车数量。
示例1
输入
3 4
3 2 2 1
输出
3
说明
解题思路
这道题的核心是要在满足最大载重的前提下,将两个人尽量配对,以减少使用的自行车数量。可以采用双指针的方法来解决问题:
- 对体重数组进行排序,从最轻到最重排列。
- 使用两个指针,一个指向体重最轻的人(左指针
left
),一个指向体重最重的人(右指针right
)。 - 每次尝试将最轻的人(左指针)和最重的人(右指针)配对:
- 如果两个人的体重之和小于或等于
M
,则他们可以共用一辆自行车,双指针同时向中间移动。 - 如果两个人的体重之和超过
M
,则最重的人独自使用一辆自行车,只移动右指针。
- 如果两个人的体重之和小于或等于
- 重复上述步骤,直到所有人都被分配到自行车上。
- 统计最少需要的自行车数量。
Java
import java.util.*;
import java.util.stream.*;