租车骑绿岛
题目描述
部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,最大载重M。
给出部门每个人的体重,请问最多需要租用多少双人自行车。
输入描述
第一行两个数字m、n,分别代表自行车限重,部门总人数。
第二行,n个数字,代表每个人的体重,体重都小于等于自行车限重m。
0<m<=200\n0<n<=1000000
输出描述
最小需要的双人自行车数量。
输入 | 3 4 3 2 2 1 |
输出 | 3 |
说明 | 无 |
源码和解析
解析:
其实重点只需要关注用户输入第一行的车载重量M和第二行输入的每个人的重量。
- 车载最多2人,可以考虑双指针来解决问题
- 为了提高运行效率,肯定需要对每个人的体重进行排序。要保证每个车尽可能地坐2个人,因此可以考虑最重的搭配一个最轻的。
- 若单人重量已经等于限重了。那么这个人就骑一个车。若剩余最重的那个人搭载一个最轻的人都还超重,那么这个人也只能一个人骑一个车。剩下的就是最重的搭配最轻的。循环解决问题了。
示例代码:
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class T29 {
public static void main(String[] args) {
String input1 = "4 4";// 第一个是每个车限重 第二个是部门人数
String input2 = "3 2 2 1";// 每个人的体重 且体重都小于限重
int m = Integer.parseInt(input1.split(" ")[0]);
String[] empWeights = input2.split(" ");
List<Integer> weightList = new LinkedList<Integer>();
for (String w : empWeights) {
weightList.add(Integer.parseInt(w));
}
//排序 降序
weightList.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 > o2) {
return -1;
} else if (o1 < o2) {
return 1;
}
return 0;
}
});
Map<Integer, String> map=new HashMap<Integer, String>();
int count=0;
int right=weightList.size()-1;//右侧指针 左侧从0开始
for(int i=0;i<=right;i++){
//如果已经到达体重了 那么就坐一个车
if(weightList.get(i)==m){
count++;
map.put(count, weightList.get(i)+"");
continue;
}
if(weightList.get(i)+weightList.get(right)<=m&&i<right){
//一个人坐不满足车载极限 应该按最大的那个来加,这样可以保证后续可以尽可能的两个人坐一个车
count++;
map.put(count, weightList.get(i)+"-"+weightList.get(right));
right--;
continue;
}else{
//一个人坐不满足车载极限,两个人哪怕是最小的也超载
count++;
map.put(count, weightList.get(i)+"");
continue;
}
}
System.out.println(map);
}
}
注意示例中的代码仅仅用于测试,里面有多余的代码。学习的时候仅供参考。这里使用了map记录了车的编号和载重人的体重,其示意结果如下:
假设部门人数为4个 且体重不变。都3 2 2 1
那么其分配的三个车的载重如下:
载重为3:
载重为4: