华为OD机试 - 最大利润 - 贪心算法(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

商人经营一家店铺,有number种商品,由于仓库限制每件商品的最大持有数量是item[index],每种商品的价格在每天是item_price[item_index][day],通过对商品的买进和卖出获取利润,请给出商人在days天内能获取到的最大利润。

注:同一件商品可以反复买进和卖出;

二、输入描述

3 //输入商品的数量 number
3 // 输入商人售货天数 days
4 5 6 //输入仓库限制每件商品的最大持有数量是itemlindex]
1 2 3 // 输入第一件商品每天的价格
4 3 2 // 输入第二件商品每天的价格
1 5 3 // 输入第三件商品每天的价格

三、输出描述

32//输出商人在这段时间内的最大利润

四、测试用例

测试用例1

1、输入

2
4
2 3
1 3 2 5
2 2 2 2

2、输出

10

3、说明

商品1:

第1天到第2天:3 > 1,利润 = (3 - 1) * 2 = 4
第2天到第3天:2 < 3,无利润
第3天到第4天:5 > 2,利润 = (5 - 2) * 2 = 6
总利润 = 4 + 6 = 10

商品2:

所有天数价格不变,无利润

总利润 = 0

总利润: 10 + 0 = 10

测试用例1

1、输入

1
5
10
1 2 3 4 5

2、输出

40

3、说明

第1天到第2天:2 > 1,利润 = (2 - 1) * 10 = 10
第2天到第3天:3 > 2,利润 = (3 - 2) * 10 = 10
第3天到第4天:4 > 3,利润 = (4 - 3) * 10 = 10
第4天到第5天:5 > 4,利润 = (5 - 4) * 10 = 10

总利润 = 10 + 10 + 10 + 10 = 40

五、解题思路

本题属于贪心算法的应用,在每个可能获利的买卖操作中,尽可能地进行买入和卖出,最大化利润。

1、详细解题步骤

  1. 逐个商品处理:
    • 对于每种商品,遍历每一天的价格变化。
  2. 计算每日利润:
    • 对于每一天(除最后一天),如果后一天的价格高于当天,则可以在当天买入,后一天卖出,获取利润。
    • 利润计算为 (后一天价格 - 当天价格) * 最大持有数量。
  3. 累计总利润:
    • 将所有商品在所有可能的买卖操作中获得的利润累加,得到最终的最大利润。

六、Python算法源码

# 导入必要的模块
import sys

def main():
    # 读取所有输入并按空白字符分割
    input = sys.stdin.read().split()
    index = 0
    
    # 读取商品的数量
    number = int(input[index])
    index +=1
    
    # 读取售货天数
    day = int(input[index])
    index +=1
    
    # 读取每种商品的最大持有数量
    maxHoldArr = list(map(int, input[index:index+number]))
    index += number
    
    # 初始化商品价格数组,大小为 number x day
    itemPriceArr = []
    for _ in range(number):
        # 读取每种商品的每天价格
        prices = list(map(int, input[index:index+day]))
        itemPriceArr.append(prices)
        index += day
    
    # 初始化最大利润
    maxProfit = 0
    
    # 遍历每种商品
    for i in range(number):
        # 遍历每一天(除最后一天)
        for j in range(day -1):
            # 当前天的购买价格
            purchasePrice = itemPriceArr[i][j]
            # 下一天的销售价格
            sellingPrice = itemPriceArr[i][j +1]
            # 如果可以获利
            if sellingPrice > purchasePrice:
                # 计算并累加利润
                maxProfit += (sellingPrice - purchasePrice) * maxHoldArr[i]
    
    # 输出最大利润
    print(maxProfit)

# 调用主函数
if __name__ == "__main__":
    main()

七、JavaScript算法源码

// 使用标准输入输出
process.stdin.resume();
process.stdin.setEncoding('utf8');

let input = '';

// 读取输入数据
process.stdin.on('data', function(chunk) {
    input += chunk;
});

// 输入结束后处理数据
process.stdin.on('end', function() {
    // 按空白字符分割输入
    const tokens = input.trim().split(/\s+/);
    let index = 0;
    
    // 读取商品的数量
    const number = parseInt(tokens[index++], 10);
    
    // 读取售货天数
    const day = parseInt(tokens[index++], 10);
    
    // 读取每种商品的最大持有数量
    const maxHoldArr = [];
    for(let i=0;i<number;i++) {
        maxHoldArr.push(parseInt(tokens[index++],10));
    }
    
    // 初始化商品价格数组,大小为 number x day
    const itemPriceArr = [];
    for(let i=0;i<number;i++) {
        const prices = [];
        for(let j=0;j<day;j++) {
            prices.push(parseInt(tokens[index++],10));
        }
        itemPriceArr.push(prices);
    }
    
    // 初始化最大利润
    let maxProfit =0;
    
    // 遍历每种商品
    for(let i=0;i<number;i++) {
        // 遍历每一天(除最后一天)
        for(let j=0;j<day-1;j++) {
            // 当前天的购买价格
            const purchasePrice = itemPriceArr[i][j];
            // 下一天的销售价格
            const sellingPrice = itemPriceArr[i][j+1];
            // 如果可以获利
            if(sellingPrice > purchasePrice){
                // 计算并累加利润
                maxProfit += (sellingPrice - purchasePrice) * maxHoldArr[i];
            }
        }
    }
    
    // 输出最大利润
    console.log(maxProfit);
});

八、C算法源码

#include <stdio.h>
#include <stdlib.h>

int main(){
    int number, day;
    
    // 读取商品的数量
    scanf("%d", &number);
    
    // 读取售货天数
    scanf("%d", &day);
    
    // 动态分配数组存储每种商品的最大持有数量
    int *maxHoldArr = (int*)malloc(number * sizeof(int));
    for(int i=0;i<number;i++) {
        scanf("%d", &maxHoldArr[i]);
    }
    
    // 动态分配二维数组存储每种商品每天的价格
    int **itemPriceArr = (int**)malloc(number * sizeof(int*));
    for(int i=0;i<number;i++) {
        itemPriceArr[i] = (int*)malloc(day * sizeof(int));
        for(int j=0;j<day;j++) {
            scanf("%d", &itemPriceArr[i][j]);
        }
    }
    
    // 初始化最大利润
    long long maxProfit =0;
    
    // 遍历每种商品
    for(int i=0;i<number;i++) {
        // 遍历每一天(除最后一天)
        for(int j=0;j<day-1;j++) {
            // 当前天的购买价格
            int purchasePrice = itemPriceArr[i][j];
            // 下一天的销售价格
            int sellingPrice = itemPriceArr[i][j+1];
            // 如果可以获利
            if(sellingPrice > purchasePrice){
                // 计算并累加利润
                maxProfit += (long long)(sellingPrice - purchasePrice) * maxHoldArr[i];
            }
        }
    }
    
    // 输出最大利润
    printf("%lld\n", maxProfit);
    
    // 释放动态分配的内存
    for(int i=0;i<number;i++) {
        free(itemPriceArr[i]);
    }
    free(itemPriceArr);
    free(maxHoldArr);
    
    return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    
    int number, day;
    
    // 读取商品的数量
    cin >> number;
    
    // 读取售货天数
    cin >> day;
    
    // 读取每种商品的最大持有数量
    vector<int> maxHoldArr(number);
    for(int i=0;i<number;i++) {
        cin >> maxHoldArr[i];
    }
    
    // 读取每种商品每天的价格
    vector<vector<int>> itemPriceArr(number, vector<int>(day));
    for(int i=0;i<number;i++) {
        for(int j=0;j<day;j++) {
            cin >> itemPriceArr[i][j];
        }
    }
    
    // 初始化最大利润
    long long maxProfit =0;
    
    // 遍历每种商品
    for(int i=0;i<number;i++) {
        // 遍历每一天(除最后一天)
        for(int j=0;j<day-1;j++) {
            // 当前天的购买价格
            int purchasePrice = itemPriceArr[i][j];
            // 下一天的销售价格
            int sellingPrice = itemPriceArr[i][j+1];
            // 如果可以获利
            if(sellingPrice > purchasePrice){
                // 计算并累加利润
                maxProfit += (long long)(sellingPrice - purchasePrice) * maxHoldArr[i];
            }
        }
    }
    
    // 输出最大利润
    cout << maxProfit << "\n";
    
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892177.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

光伏仿真系统的好处

现在的做光伏电站的项目&#xff0c;很多任务都是后置的&#xff0c;这样的话问题的暴露就会在每个时间段&#xff0c;光伏仿真系统的好处&#xff0c;就是在做每一步工作前&#xff0c;系统已经把每一步的工作都分配好了&#xff0c;有任何问题都可以提前知道&#xff0c; 获…

awk工具的基本使用

awk的作用从整体上来说就是用来分隔文本的。 默认是根据空白字符&#xff0c;将一行文件内容分隔成多部份。 常用选项&#xff1a; 使用-F的选项来指定awk工具使用的分隔符&#xff0c; 在awk内部有类似于$1,$2,$3这样的变量&#xff0c;$1代表第一部分&#xff0c;$2代表第…

密码管理APP系统规格说明书(初版)

这里写目录标题 1 引言1.1 背景1.2 目的1.3 范围 2 系统需求2.1 功能需求2.2 性能需求2.3 安全需求2.4 兼容性需求 3 系统设计3.1 总体架构3.1.1 系统架构概述3.1.2 技术选型 3.2 功能模块设计3.2.1 密码生成模块3.2.2 安全存储模块3.2.3 自动填充模块3.2.4 多平台支持模块3.2.…

开源商城系统crmeb phpstudy安装配置

BOSS让我最快时间部署一套开源商场系统&#xff0c;今天就以crmeb为例。 快速部署在linux中我会首选docker&#xff0c;因为我要在windows中部署&#xff0c;本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点&#xff1a; CRMEB产品与服务 CRMEB通过将CRM&#x…

SPI通信时序

前言&#xff1a; 作为Motorola的又一伟大发明的SPI总线通信协议&#xff0c;在理解和应用上也是十分复杂且难以理解&#xff0c;博主想通过这篇文章想把SPI的原理和应用大概讲一下&#xff0c;同时也是记录自己对于I2C的学习和理解。 SPI概述&#xff1a; SPI 是英语Serial P…

【C语言复习专题】函数调用

【C语言复习专题】函数调用 1.递归是什么&#xff1f;1.1递归的思想&#xff1a;1.2递归的限制条件 2.递归举例2.1eg1&#xff1a;求n的阶乘2.1.1 分析和代码实现2.1.2作图演示过程 2.2 eg2&#xff1a;顺序打印一个整数的每一位2.2.1分析 3.递归与迭代 1.递归是什么&#xff1…

2-124 基于matlab得结构稀疏字典实现SAR图像低秩重建

基于matlab得结构稀疏字典实现SAR图像低秩重建&#xff0c;通过K-SVD和W-KSVD结合OMP进行重建。K-SVD算法是一种字典学习算法&#xff0c;能够对字典进行优化&#xff0c;使其能够更好地表示训练样本集。W-KSVD算法是K-SVD算法的扩展&#xff0c;它能够利用权重信息对字典进行优…

华为---Super VLAN简介及示例配置

目录 1. Super VLAN技术产生背景 2. Super VLAN概念 3. Super VLAN应用场景 4. Super VLAN工作原理 5. Super-VLAN主要配置命令 6. Super-VLAN主要配置步骤 7. 示例配置 7.1 示例场景 7.2 网络拓扑 7.3 配置代码 7.4 代码解析 7.5 测试验证 1. Super VLAN技术产生背…

【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)

本文项目编号 T 020 &#xff0c;文末自助获取源码 \color{red}{T020&#xff0c;文末自助获取源码} T020&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

ubuntu20.4环境下gcc-aarch64交叉编译器的安装

交叉编译器&#xff08;Linux环境&#xff09;arm gcc 8.3一共有5个版本&#xff0c;常用的有4个版本&#xff08;另外一个为大端linux版本&#xff09;&#xff0c;分别是32bit裸机版本&#xff08;arm-eabi&#xff09;、64bit裸机版本&#xff08;aarch64-elf&#xff09;、…

2015年-2016年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 2015年1.c语言程序设计部分2.数据结构程序设计部分 2016年1.c语言程序设计部分2.数据结构程序设计部分 2015年 1.c语言程序设计部分 1.从一组数据中选择最大的和最小的输出。 void print_maxandmin(double a[],int length) //在一组数据中选择最大的或者最小的输出…

EM算法学习

1.EM算法的介绍 可以发现&#xff1a;计算出θA和θB的值的前提是知道A、B币种的抛掷情况。 所以我们需要使用EM算法&#xff1a;求出每轮选择硬币种类的概率 2.EM算法执行过程&#xff1a; 第一步&#xff1a;首先初始化设置一组PA和PB证明的值。然后通过最大似然估计得到每…

2024软考网络工程师笔记 - 第3章.广域通信网

文章目录 广域网物理层特性1️⃣公共交换电话网 PSTN2️⃣本地回路3️⃣机械特性4️⃣电气特性 &#x1f551;流量与差错控制1️⃣流量与差错控制2️⃣流量控制——亭等协议3️⃣流控机制——滑动窗口协议4️⃣差错控制5️⃣差错控制——停等协议6️⃣差错控制——选择重发ARQ协…

MySQL【知识改变命运】08

数据库约束 1&#xff1a;约束的几个类型2&#xff1a;NOT NULL非空约束3&#xff1a;UNIQUE 唯⼀约束4&#xff1a;PRIMARY KEY 主键约束4.1:回顾 5&#xff1a;FOREIGN KEY 外键约束5.1&#xff1a;创建班级表(主表)&#xff0c;并初始化数据5.2&#xff1a;重构学⽣表(从表)…

【Golang】Go语言http编程底层逻辑实现原理与实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

文章目录 写在前面一、Docker 官方源二、更换Docker 国内可用镜像源 &#xff08;推荐使用&#xff09;参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0c;docker-27.3.1 一、Docker 官方源 打开 /etc/docker/daemon.json文件&#xff1a; sudo gedit …

STM32F4- SD卡和 FATFS文件系统

单片机系统常需大容量存储设备&#xff0c;如U盘、FLASH芯片、SD卡等。 其中&#xff0c;SD卡因容量大、支持SPI/SDIO驱动、尺寸多样&#xff0c;成为单片机系统的优选。 STM32F4开发板自带SD卡接口&#xff0c;使用SDIO接口驱动&#xff0c;支持高速数据传输。 1.1 SDIO 简介…

JavaWeb学习(1)

目录 一、什么是JavaWeb 二、静态web和动态web 三、Web服务器&#xff08;Tomcat&#xff09; 四、Http 4.1 是什么 4.2 两个时代 4.3 Http请求 4.4 Http响应 五、Maven 六、Servlet 七、HttpServletResponse 7.1 常见应用 7.1.1 向浏览器输出消息 7.1.2 下载文件 …

为您的人工智能数据提供类似 Git 的版本管理功能

您过去肯定有过版本控制代码。但是&#xff0c;您是否对数据进行了版本控制&#xff1f;您是否曾经想过与不同的团队协作处理大量数据&#xff0c;而无需提交大量数据&#xff1f;想象一下&#xff0c;使用类似 git 的命令来运行类似存储库的生态系统&#xff0c;在该生态系统中…

Unity实现自定义图集(三)

以下内容是根据Unity 2020.1.0f1版本进行编写的   1、实现编辑器模式下进游戏前Pack全部自定义图集 同Unity的图集一样,Unity的编辑器模式会在进游戏前把全部的SpriteAtlas都打一次图集,如图: 我们也实现这样的效果。 首先需要获取全部的图集路径。因为目前使用的是以.…