2024华为OD试题及答案-A057-租车骑绿岛

题目描述

部门组织绿岛骑行团建活动。租用公共双人自行车,每辆自行车最多坐两人,最大载重M。
给出部门每个人的体重,请问最多需要租用多少双人自行车。

输入描述

第一行两个数字m、n,分别代表自行车限重,部门总人数。

第二行,n个数字,代表每个人的体重,体重都小于等于自行车限重m。

  • 0<m<=200
  • 0<n<=1000000

输出描述

最小需要的双人自行车数量。

用例
输入3 4
3 2 2 1
输出3
说明

问题分析

输入

  1. 两个整数 m, n 分别表示自行车的限重和部门总人数。
  2. 一行 n 个整数,代表每个人的体重。

输出

  • 最少需要的双人自行车数量。

处理步骤

  1. 排序:将所有人的体重从小到大排序。
  2. 双指针法
    • 使用两个指针,一个指向最轻的人,一个指向最重的人。
    • 如果这两个人的体重和不超过限重,他们可以共用一辆自行车,然后移动两个指针。
    • 如果这两个人的体重和超过限重,最重的人需要单独使用一辆自行车,移动最重的指针。
    • 继续上述过程直到所有人都安排上自行车。

解题思路

  1. 读取输入数据:包括自行车限重、自行车总人数以及每个人的体重。
  2. 对体重进行排序:方便双指针法处理。
  3. 使用双指针法分配自行车
    • 初始化两个指针,一个指向最轻的人,一个指向最重的人。
    • 根据条件分配自行车,移动指针。
  4. 输出结果:输出最少需要的自行车数量。

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
    

    输入自行车限重、总人数以及每个人的体重,并按回车键查看输出。

这两个程序将会读取输入的数据,计算并输出最少需要的双人自行车数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值