题目描述
部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,最大载重M。
给出部门每个人的体重,请问最多需要租用多少双人自行车。
输入描述
第一行两个数字m、n,分别代表自行车限重,部门总人数。
第二行,n个数字,代表每个人的体重,体重都小于等于自行车限重m。
0<m<=200
0<n<=1000000
输出描述
最小需要的双人自行车数量。
用例
输入 | 3 4 3 2 2 1 |
输出 | 3 |
说明 | 无 |
问题分析
输入
- 两个整数 m, n 分别表示自行车的限重和部门总人数。
- 一行 n 个整数,代表每个人的体重。
输出
- 最少需要的双人自行车数量。
处理步骤
- 排序:将所有人的体重从小到大排序。
- 双指针法:
- 使用两个指针,一个指向最轻的人,一个指向最重的人。
- 如果这两个人的体重和不超过限重,他们可以共用一辆自行车,然后移动两个指针。
- 如果这两个人的体重和超过限重,最重的人需要单独使用一辆自行车,移动最重的指针。
- 继续上述过程直到所有人都安排上自行车。
解题思路
- 读取输入数据:包括自行车限重、自行车总人数以及每个人的体重。
- 对体重进行排序:方便双指针法处理。
- 使用双指针法分配自行车:
- 初始化两个指针,一个指向最轻的人,一个指向最重的人。
- 根据条件分配自行车,移动指针。
- 输出结果:输出最少需要的自行车数量。
C++实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
vector<int> weights(n);
for (int i = 0; i < n; ++i) {
cin >> weights[i];
}
sort(weights.begin(), weights.end());
int left = 0, right = n - 1;
int bike_count = 0;
while (left <= right) {
if (weights[left] + weights[right] <= m) {
++left;
}
--right;
++bike_count;
}
cout << bike_count << endl;
return 0;
}
Python实现
def main():
import sys
input = sys.stdin.read
data = input().split()
m = int(data[0])
n = int(data[1])
weights = list(map(int, data[2:]))
weights.sort()
left = 0
right = n - 1
bike_count = 0
while left <= right:
if weights[left] + weights[right] <= m:
left += 1
right -= 1
bike_count += 1
print(bike_count)
if __name__ == "__main__":
main()
使用说明
-
将上述C++代码保存为
min_bikes.cpp
,然后使用命令行编译和运行:g++ min_bikes.cpp -o min_bikes ./min_bikes
输入自行车限重、总人数以及每个人的体重,并按回车键查看输出。
-
将上述Python代码保存为
min_bikes.py
,然后使用命令行运行:python min_bikes.py
输入自行车限重、总人数以及每个人的体重,并按回车键查看输出。
这两个程序将会读取输入的数据,计算并输出最少需要的双人自行车数量。