部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,做最大载重M。
给出部门每个人的体重,请问最多需要租用多少双人自行车。
输入描述:
第一行两个数字m、n,分别代表自行车限重,部门总人数。
第二行,n个数字,代表每个人的体重,体重都小于等于自行车限重m。
0<m<=200
0<n<=1000000
输出描述:
最小需要的双人自行车数量。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3 4
3 2 2 1
输出
3
import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
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);
}
}
思路:
1.先把所有人体重从小到大排序
2.一辆车最多坐两人,所以最大的和最小的先匹配
如果最大的(右指针)和最小的(左指针)坐都超重了,就说明最大的这个人只能自己一辆车,因为没有其他人可以和他一起坐,需要的车数+1
最小的人继续不动(左指针不动),右指针左移一个(即倒数第2重的人),如果两人可以做,则他们俩坐吧,需要车+1
此后左指针右移1位,右指针左移一位,以此类推(思想就是超重则大的自己坐,小的不动,不超重则两人去坐,然后看其他两位)
3.如果指针最后移动到同一个人身上,说明已经没有人,只剩他一个人了,就只能自己坐一辆车