高效货运 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

  1. 老李是货运公司承运人,老李的货车额定载货重量为wt;
  2. 现有两种货物,货物A单件重量为wa,单件运费利润为pa,货物B单件重量为wb,单件运费利润为pb;
  3. 老李每次发车时载货总重量刚好为货车额定载货重量wt,车上必须同时有货物A和货物B,货物A、B不可切割;
  4. 老李单车次满载运输可获得的最高利润是多少。

输入描述

第一列输入为货物A的单件重量wa,0 < wa < 10000

第二列输入为货物B的单件重量wb,0 < wb < 10000

第三列输入为货车的额定载重wt,0 < wt < 100000

第四列输入为货物A的单件运费利润pa,0 < pa < 1000

第五列输入为货物B的单件运费利润pb,0 < pb < 1000

输出描述

单次满载运输的最高利润

示例1

输入:
10 8 36 15 7

输出:
44

示例2

输入:
1 1 2 1 1

输出:
2

题解

题目要求:

  1. 车次满载;
  2. 同时有货物A和货物B 且 货物A、B不可切割;

解题思路:

  1. 计算货物 A 最多可以装的个数,即 n = (wt + wa - 1) / wa
  2. 使用循环枚举货物 A 的个数 ca,范围为 [1, n)。这样保证有剩余空间用于装货物 B。
  3. 判断车整好满载的条件为 (wt - wa * ca) % wb == 0,如果满足,则计算货物 B 的个数 cb
  4. 更新最高利润 maxProfit
  5. 输出最终结果 maxProfit

Java

import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
   

    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);

        // 读取输入值
        int wa = scanner.nextInt(), wb = scanner.nextInt();
        int wt = scanner.nextInt();
        int pa = scanner.nextInt(), pb = scanner.nextInt();

        int maxProfit = 0;
        int n = (wt + wa - 1) / wa;  // 货物 A 最多可以装的个数

        for (int ca = 1; ca < n; ca++) {
     // 枚举装货物 A 的个数 ca: [1, n), 这样就可以保证有剩余空间
            if ((wt - wa * ca) % wb == 0) {
     // 车整好满载
                int cb = (wt - wa * ca) / wb;  // 货物 B 的个数
                maxProfit = Math.max(maxProfit, ca * pa + cb * pb);
            }
        }

        System.out.println(maxProfit);
    }
}

Python

wa, wb, wt, pa, pb = map(int, input().split())

max_profit = 0
n = (wt + wa - 1) // wa  # 货物 A 最多可以装的个数

for ca in range(1, n):  # 枚举装货物 A 的个数 ca: [1, n), 这样就可以保证有剩余空间
    if (wt - wa * ca) % wb == 0:  # 车整好满载
        cb = (wt - wa * ca) // wb   # 货物 B 的个数
        max_profit = max(max_profit, ca * pa + cb * pb)

print(max_profit)

C++

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
   
    // 读取输入值
    int wa, wb, wt, pa, pb;
    cin >> wa >> wb >> wt >> pa >> pb;

    int maxProfit = 0;
    int n = (wt + wa - 1) / wa;  // 货物 A 最多可以装的个数

    for (int ca = 1; ca < n; ca++) {
     // 枚举装货物 A 的个数 ca: [1, n), 这样就可以保证有剩余空间
        if ((wt - wa * ca) % wb == 0) {
     // 车整好满载
            int cb = (wt - wa * ca) / wb;  // 货物 B 的个数
            maxProfit = max(maxProfit, ca * pa + cb * pb);
        }
    }

    cout << maxProfit << endl;

    return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-16 15:52:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-16 15:52:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-16 15:52:01       87 阅读
  4. Python语言-面向对象

    2024-02-16 15:52:01       96 阅读

热门阅读

  1. 算法训练营day27(补),贪心算法1

    2024-02-16 15:52:01       48 阅读
  2. 记录 | ubuntu pyqt5 pycharm配置

    2024-02-16 15:52:01       66 阅读
  3. makefile使用

    2024-02-16 15:52:01       46 阅读