华为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、详细解题步骤
- 逐个商品处理:
- 对于每种商品,遍历每一天的价格变化。
- 计算每日利润:
- 对于每一天(除最后一天),如果后一天的价格高于当天,则可以在当天买入,后一天卖出,获取利润。
- 利润计算为 (后一天价格 - 当天价格) * 最大持有数量。
- 累计总利润:
- 将所有商品在所有可能的买卖操作中获得的利润累加,得到最终的最大利润。
六、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在线答疑。