华为OD机试 - 贪心的商人 - 贪心(Java 2025 A卷 100分)

这是一道华为面试的编程题,商人有三种商品,每种商品有最大库存限制,每天价格不同。目标是求在给定天数内通过买卖商品获得的最大利润。解题思路采用贪心算法,动态记录每种商品每天的价格,并计算最大利润。Java算法源码给出了详细的解决方案,最终输出最大利润为32。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

商人经营一家店铺,有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 2 3 4
2 3 4 5

2、输出

15

3、说明

第一件商品: (2-1)*2 + (3-2)*2 

### 贪心算法商人问题的Java实现 贪心算法的核心在于每一步都选择局部最优解,从而期望达到全局最优解。然而需要注意的是,这种策略并不一定适用于所有场景[^2]。对于特定的问题,比如商人买卖问题,可以通过析价格波动和库存情况来设计解决方案。 以下是基于引用中的商人买卖问题的一个具体实现: #### 代码实现 ```java package com.example.greedymerchant; import java.util.Scanner; import java.util.stream.IntStream; public class GreedyMerchant { public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { // 输入商品数量和天数 int numberOfItems = sc.nextInt(); int numberOfDays = sc.nextInt(); // 商品初始库存数组 int[] inventory = IntStream.range(0, numberOfItems) .map(i -> sc.nextInt()) .toArray(); // 每个商品每天的价格矩阵 int[][] prices = IntStream.range(0, numberOfItems) .mapToObj(i -> IntStream.range(0, numberOfDays) .map(j -> sc.nextInt()) .toArray()) .toArray(int[][]::new); // 计算总利润 long totalProfit = calculateTotalProfit(inventory, prices); // 输出结果 System.out.println(totalProfit); } } private static long calculateTotalProfit(int[] inventory, int[][] prices) { return IntStream.range(0, inventory.length).asLongStream() .flatMapToLong(itemIndex -> IntStream.range(0, prices[itemIndex].length - 1) .filter(dayIndex -> prices[itemIndex][dayIndex + 1] > prices[itemIndex][dayIndex]) .mapToLong(dayIndex -> (long)(prices[itemIndex][dayIndex + 1] - prices[itemIndex][dayIndex]) * inventory[itemIndex])) .sum(); } } ``` 此程序实现了通过输入商品的数量、天数以及每日价格变化,计算出商人在整个交易周期内的最大利润。核心逻辑是在每一天判断第二天的价格是否会更高,如果是,则记录差价作为潜在收益[^4]。 --- ### 关键点解析 1. **数据结构的设计** 使用二维数组存储每个商品在不同时间的价格变化情况,一维数组用于保存各个商品的初始库存量。这样的设计便于后续遍历操作并快速获取所需的数据[^4]。 2. **贪心策略的应用** 对于每一个商品,在其生命周期内寻找价格上涨的会,并假设在此期间完成买入卖出动作即可获得相应利润。这种方法忽略了其他可能更复杂的市场因素,仅关注简单的差价获利模式。 3. **性能考量** 利用了`IntStream`流式处理简化循环嵌套的同时提升了可读性和效率。时间复杂度主要取决于两层循环——外层针对物品数量,内层则涉及日期跨度,总体表现为O(n*m),其中n代表商品种类数而m则是观察期长度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值