华为OD机试真题-最大利润【C++ Java Python】

文章目录


目录

题目内容

解题思路

Java代码

Python代码

C++代码

题目内容


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

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


输入描述


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


输入:
3
3
4 5 6
1 2 3
4 3 2
1 5 3


输出:
32

解题思路


由于题目比较复杂,为了降低难度,先不看示例case,假设有一件商品:

第 0 天的价格:1

第 1 天的价格:2

第 2 天的价格:3

第 3 天的价格:4

贪心算法的策略:由于不限制交易次数,只要今天价格比昨天高,就在昨天买,在今天卖。

比如上述商品,它的价格为 [1, 2, 3, 4] ,这 4 天的价格依次上升,按照贪心算法,得到的最大利润是:

res = (prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0]) = prices[3] - prices[0]


如果你读不懂上述例子,我们可以这么理解:第 0 天买, 第 1 天卖;第 1 天再买,第 2 天卖;第 2 天再买, 第 3 天卖;为什么这么操作?正如之前的贪心策略:只要今天价格比昨天高,就在昨天买,然后在今天卖。你可能会问:为什么不能在第 0 天买入,然后一直存放着不卖,直到第三天再卖出? 当然可以按照你的想法交易,但是我们的策略是不是等同于第 0 天买入,第 3 天卖出? 你可以自己计算一下,两种做法是不是最终的收益是一样的。

好了,当你理解了一件商品的买卖策略之后,多件商品的买卖策略完全相同。对于本题,多件商品,我们可以这么解题:

最开始,将最大利润设置为 0。
然后遍历每件商品,计算利润。

  • 遍历每天的价格,计算该商品每天的利润当天价格 - 前一天价格的差值,如果差值为负数,则取0。
  • 将每天的利润累加,得到该商品总利润。
  • 计算该商品的最大利润,商品利润*仓库限制的最大持有数量。
  • 将商品最大利润累加到总利润。

Java代码


import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 商品数量和售货天数
        int numberOfItems = Integer.parseInt(in.nextLine());
        int days = Integer.parseInt(in.nextLine());

        // 仓库限制的每件商品最大持有数量
        List<Integer> maxItemLimits = Arrays.stream(in.nextLine().split(" "))
                .map(Integer::parseInt)
                .collect(Collectors.toList());

        // 每件商品每天的价格
        List<ArrayList<Integer>> itemPrices = new ArrayList<ArrayList<Integer>>();
        for (int i = 0; i < numberOfItems; i++) {
            List<Integer> dailyPrice = Arrays.stream(in.nextLine().split(" "))
                .map(Integer::parseInt)
                .collect(Collectors.toList());
            itemPrices.add(new ArrayList<>(dailyPrice));
        }

        // 最大利润
        int maxProfit = 0;
        
        for (int i = 0; i < itemPrices.size(); i++) {
            int profit = 0;
            for (int j = 1; j < itemPrices.get(i).size(); ++j) {
                profit += Math.max(0, itemPrices.get(i).get(j) - itemPrices.get(i).get(j - 1));
            }
            // 将商品利润累加到总利润
            maxProfit += profit * maxItemLimits.get(i);
        }

        System.out.println(maxProfit);
    }
}

Python代码


# coding:utf-8

import functools
# 商品数量
num_goods = int(input())

# 售货天数
num_days = int(input())

# 每种商品的最大持有数量
max_stock = [int(x) for x in input().split(" ")]

# 每种商品每天的价格
prices = []
for i in range(num_goods):
    prices.append([int(x) for x in input().split(" ")])

# 总利润
total_profit = 0

for i in range(len(prices)):
    profit = 0 
    for j in range(1, len(prices[i])):
        # 如果今天的价格高于昨天的价格,则买进昨天,今天卖出,获得利润
        # 如果今天的价格低于昨天的价格,那么就不操作,利润为0
        profit += max(0, prices[i][j] - prices[i][j-1])

    # 将每种商品的利润加入总利润
    total_profit += profit * max_stock[i]

print(total_profit)


C++代码


#include<iostream>
#include<vector>
using namespace std;

int main() {
    // 商品数量和经营天数
    int itemNum, days;
    cin >> itemNum >> days;

    // 每种商品的最大持有量
    vector<int> maxItem;
    for (int i=0; i<itemNum; i++) {
        int maxHold;
        cin >> maxHold;
        maxItem.push_back(maxHold);
    }

    // 每种商品每天的价格
    vector<vector<int>> prices;
    for (int i=0; i<itemNum; i++) {
        vector<int> price;
        for (int j=0; j<days; j++) {
            int p;
            cin >> p;
            price.push_back(p);
        }
        prices.push_back(price);
    }
    
    int maxProfit = 0;
    for (int i=0; i<prices.size(); i++) {
        int profit = 0;
        // 每天比较今天的价格与昨天的价格,如果今天价格高,则卖出商品获利
        for (int j=1; j<prices[i].size(); j++) {
            profit += max(0, prices[i][j] - prices[i][j-1]);
        }
        maxProfit += profit * maxItem[i];
    }
        
    cout << maxProfit << endl;

    return 0;
}

20天拿下华为OD笔试之 【DP/贪心】2023Q1A-贪心的商人【闭着眼睛学数理化】全网注释最详细分类最全的华为OD真题题解 商人经营一家店铺,有number种商品,由于仓库限制每件商品的最大持有数量是,每种商品的价格在每天是,通过对商品的买进和卖出获取利润,请给出商人在days天内能获取到的最大的利润;注: 同一件商品可以反复买进和卖出; 阅读详情

相关推荐

华为OD机试真题-最大利润【2023.Q1】

4 5 6 第三行输入仓库限制每件商品的最大持有数量是item[index]由于仓库限制每件商品的最大持有数量是 item[index]。请给出商人在 days 天内能获取的最大的利润。商人经营一家店铺,有number 种商品,3 第一行输入商品的数量 number。3 第二行输入商品售货天数 days。注:同一件商品可以反复买进和卖出。1 2 3 第一件商品每天的价格。4 3 2 第二件商品每天的价格。1 5 3 第三件商品每天的价格。通过对商品的买进和卖出获取利润。然后遍历每件商品,计算利润。

AlgorithmHero的博客 402

【华为OD机试真题 java、python、c++、JsNode】最大利润、贪心的商人(100%通过+复盘思路)

商人经营一家店铺(商人经营店铺),有number种商品, 由于仓库限制每件商品的最大持有数量是item[index] 每种商品的价格是item-pricelitem index][day] 通过对商品的买进和卖出获取利润 请给出商人在days天内能获取的最大的利润 注: 同一件商品可以反复买进和卖出

hjc的博客 2166

【华为OD机试真题E卷 Java语言】493、最大利润 | 机试真题+思路参考+代码解析(E卷复用)

【华为OD机试真题E卷 Java语言】493、最大利润 | 机试真题+思路参考+代码解析(E卷复用) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备战华为od,华为od算法,华为o

KJ.JK 2993

【华为OD机试真题 2025A卷】640、最大利润、贪心的商人 | 机试真题+思路参考+代码解析(C++、Java、Py)(A卷复用)

【华为OD机试真题 2025A卷】640、最大利润、贪心的商人 | 机试真题+思路参考+代码解析(C++、Java、Py)(A卷复用) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何

KJ.JK 750

【华为OD机试真题】115、最大利润 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >商人经营一家店铺, 有number种商品,由于仓库限制每件商品的最大持有数量是item[index],每种商品的价格是item-price[item _index][day], 通过对商品的买进和卖出获取利润,请给出商人在days天内能获取的最大的利润   注:同一件商品可以反复买进和卖出

KJ.JK 1万+

2024年华为od机试真题题库

我是一名软件开发机构老师,我的学生已经有上百人通过了华为OD机试,2024年8月-2025年2月考的都是OD统一考试(E卷),题库已经整理好了,命中率95%以上。

面试高手的博客 9万+

2026年华为od机试真题题库

OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)

面试高手的博客 19万+

华为OD机试真题目录汇总(C语言、C++、Java、Python、JS五种语言解法) 2025 B+C+D卷

本文是2024华为OD机试真题(C C++ Java Py JS) B卷专栏的目录贴(定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏每篇的文章都会将使用C语言、C++、Python、Java、JS五种语言进行更新解答,包含真题,思路分析,代码参考,每个题目的思路分析都非常详细,超过百字欢迎大家订阅学习,代码可以直接运行使用,限时优惠,持续更新)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。

KJ.JK 8万+

2025华为OD机试真题(Python 语言) B+C+D+E卷真题目录介绍,带你了解什么是华为OD,机试真题(570道)

本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 14万+

【华为OD机试c++/java/python 真题2023 Q1】

最后收集了华为OD机试前线最新战况,快来看看刚考完的小伙伴们都考到了哪些题目吧! 是不是有点迫不及待了? 对于这些别人考过的真题一定要掌握熟练,说不定你也会考到哦!

goldarmour的博客 8192

【华为OD机试真题】10、最大时间 | 机试真题+思路参考+代码解析(C语言、C++、Java、Py、JS)

给定一个数组,里面有 6 个整数,求这个数组能够表示的最大 24 进制的时间是多少,输出这个时间,无法表示输出 invalid

KJ.JK 3364

2024华为OD机试C+D卷真题目录汇总 (C C++ Java Py JS),五种语言解答

本文是2024华为OD机试(C C++ Java Py JS) C+D卷专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。

KJ.JK 2万+

【华为OD机试真题】29、组成最大数 | 机试真题+思路参考+代码解析(C语言、C++、Java、Py、JS)

小组中每位都有一张卡片,卡片上是6位内的正整数,将卡片连起来可以组成多种数字,计算组成的最大数字

KJ.JK 1万+

FPGA实现Gardner环定时同步:Verilog代码与Testbench实战解析

本文深入解析了在FPGA上实现Gardner环定时同步的完整过程,详细阐述了其非数据辅助的定时误差检测原理。通过Verilog代码实战,展示了内插滤波器、定时误差检测器、环路滤波器和数控振荡器等核心模块的设计,并提供了完整的Testbench验证方法,帮助开发者解决数字通信系统中的时钟同步难题。

gpt4scribbler的博客 576

通信原理与MATLAB(八):2PSK的调制解调

通信原理和MATLAB

菜yuan~的博客 3万+

永磁同步电机功率计算实战:从公式到避坑指南(附Excel计算模板)

本文详细解析永磁同步电机(PMSM)功率计算的实战技巧,涵盖三维参数体系、三相与单相系统差异、动态工况补偿及常见计算陷阱。特别提供Excel计算模板,帮助工程师快速准确完成功率计算,避免工业应用中的常见错误,提升工作效率。

x8y9z0的博客 806

基于分段线性近似的Softmax硬件加速器设计

本文深入探讨了基于分段线性近似的Softmax硬件加速器设计。针对深度学习模型中Softmax函数在硬件实现时指数运算成本高昂的问题,提出用分段线性拟合替代传统泰勒展开,通过一次乘加操作高效完成计算,并详细分析了输入范围压缩、精度与硬件资源权衡、以及包含地址生成、参数查找、乘加计算和归一化的完整硬件架构。该方法在保证精度的同时,显著提升了AI边缘芯片的推理速度和能效。

weixin_28278377的博客 312

Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制

本文全面解析 Android System UI 的架构设计、功能演进及场景化定制,揭示其作为安卓系统核心交互层的技术特性与生态价值。

学无止境 1579

华为OD机试 C++【TLV解析】

这里的valueOffset指的是value在整串消息里的起始位置(从0开始数)。这表示tag是15(十六进制的0F),length是4,接着的8个字符是value的内容。你收到了一串由两端设备传递的TLV格式的消息,现在你需要根据这串消息生成一个对应的(tag, length, valueOffset)列表。tag是15,对应的数据长度为4,value从第3个字节开始,所以偏移量为2。第二行:一个数字n,表示我们给出的tag的数量(0 < n < 1000)。第一行:一串消息,长度不超过10000。

wtswts1232的博客 482

AMD机密计算虚拟机介绍

AMD机密计算虚拟机介绍

木简熙的博客 524

YOLOv8/v9实战:从零搭建智慧零售货架管理系统(附完整可运行代码)

摘要:本文基于YOLOv8/v9目标检测算法,详细讲解智慧零售货架管理系统的开发流程,解决传统人工巡检效率低、漏检率高的问题。内容涵盖环境配置、商品检测、陈列分析、价格标签验证等核心功能实现,提供可运行代码及零售专用数据集训练方法。系统支持实时货架状态监控、缺货预警与数据分析,帮助零售企业降低运营成本30%以上。 关键词:YOLOv8、YOLOv9、智慧零售、货架管理、商品检测 标签:YOLOv8、YOLOv9、目标检测、零售AI、Python

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1310

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 华为OD机试真题-组合出合法最小数【2023.Q1】
下一篇: 华为OD机试真题-优雅子数组(C++ Java Python)
AlgorithmHero
博客等级 码龄4年 606粉丝 1067原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlgorithmHero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值