【最新华为OD机试E卷】虚拟理财游戏(100分)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员

💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历

✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解

🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码

👏 感谢大家的订阅➕ 和 喜欢💗 和手里的小花花🌸

最新华为OD机试E卷全、新、准,题目覆盖率达 95% 以上,其中D卷题目全部支持在线评测,E卷题目正在持续上线中~

最新华为OD机试专栏: https://www.nowcoder.com/creation/manager/columnDetail/MgbyJj

🎀关于华为OD

  • ✨华为OD的概念 华为的大部分社会招聘采用了被称为OD(Outsourcing Dispatch)模式,这是一种与德科共同进行的招聘方式。在这种模式下,被招聘的员工通常被定级在13至17级,这些员工被视为华为的储备人才。华为每年会从这些OD项目中选拔表现出色的员工,并将他们转为正式员工。
  • ⌚️华为 OD 应聘流程
    • 第一步:投递简历

      • 提供姓名、邮箱、手机号、身份证号,用于锁定,所以投递前需要考虑清楚,投到项目组之后,一般不会转给另一个项目的 HR 了,也就是被锁定。
    • 第二步:机试

      • 3 道算法题,400 分满分,一般 1 个月的准备时间,华为机试必须要 150 分以上,没有过半年之后才能参加下一次考试。
    • 第三步:技术面

      • 2 轮技术面试。
    • 第四步:HR 与主管面试

    • 第五步:录用,发 offer

alt

🍓OJ题目截图

alt

💰 虚拟理财游戏

题目描述

在一款虚拟游戏中,玩家需要通过投资来增加自己的资产,以免被淘汰出局。游戏中有一家银行提供 个理财产品,每个产品的风险和投资回报不同。玩家拥有 元的初始资金,可以接受的总风险值为

为了在游戏中取得胜利,玩家需要在可接受的风险范围内,选择最优的投资方式以获得最大回报。游戏规则如下:

  1. 每项投资的风险值相加为总风险值。
  2. 玩家最多只能投资 个理财产品。
  3. 投资金额必须为整数,不能拆分为小数。
  4. 投资回报 = 投资金额 × 回报率。

现在请你帮助玩家设计一个最佳的投资策略。

输入格式

第一行包含三个整数 ,分别表示理财产品数量、总投资金额和可接受的风险值。

第二行包含 个整数,表示每个理财产品的投资回报率。

第三行包含 个整数,表示每个理财产品的风险值。

第四行包含 个整数,表示每个理财产品的最大投资额度。

输出格式

输出一行,包含 个整数,表示在每个理财产品上的投资金额。如果不投资某个产品,则对应的投资金额为

样例输入

5 100 10
10 20 30 40 50 
3 4 5 6 10
20 30 20 40 30

样例输出

0 30 0 40 0

样例解释

在给定的 个理财产品中,选择投资第 个产品 元和第 个产品 元,总投资 元,总风险值为 ,满足要求。投资回报为 元,是所有满足条件的投资方案中回报最高的。

数据范围

  • 投资回报率
  • 风险值
  • 最大投资额度

题解

暴力枚举

题目有一个关键限制:玩家最多只能投资 个理财产品。这就大大简化了问题的复杂度。

可以这样考虑:从 个理财产品中选择 个或 个产品进行投资,使得选择的产品总风险值不超过 ,总投资额不超过 ,并且投资回报最大化。

由于 的数量级很小,最多只有 ,可以直接用暴力枚举的方法来解决这个问题。具体步骤如下:

  1. 枚举选择 个产品的所有情况,对于每个产品,如果其风险值和投资额都满足条件,就计算投资回报,更新答案。

  2. 枚举选择 个产品的所有情况,对于每对产品,如果它们的风险值之和和投资额之和都满足条件,就计算总投资回报,更新答案。

  3. 最后,我们就得到了在风险值和投资额限制下的最大投资回报,以及对应的投资方案。

参考代码

  • Python
# 读入数据
m, N, X = map(int, input().split())
rates = list(map(int, input().split()))
risks = list(map(int, input().split()))
limits = list(map(int, input().split()))

# 初始化答案
max_profit = 0
ans = [0] * m

# 枚举选1个产品的情况
for i in range(m):
    if risks[i] <= X and limits[i] <= N:
        profit = rates[i] * limits[i]
        if profit > max_profit:
            max_profit = profit
            ans = [0] * m
            ans[i] = limits[i]

# 枚举选2个产品的情况        
for i in range(m):
    for j in range(i+1, m):
        if risks[i] + risks[j] <= X and limits[i] + limits[j] <= N:
            profit = rates[i] * limits[i] + rates[j] * limits[j]
            if profit > max_profit:
                max_profit = profit
                ans = [0] * m
                ans[i] = limits[i]
                ans[j] = limits[j]

# 输出答案                
print(*ans)
  • C
#include <stdio.h>

#define MAX_M 20

int main() {
    int m, N, X;
    int rates[MAX_M], risks[MAX_M], limits[MAX_M];
    
    // 读入数据
    scanf("%d %d %d", &m, &N, &X);
    for (int i = 0; i < m; i++) {
        scanf("%d", &rates[i]);
    }
    for (int i = 0; i < m; i++) {
        scanf("%d", &risks[i]);
    }
    for (int i = 0; i < m; i++) {
        scanf("%d", &limits[i]);
    }
    
    // 初始化答案
    int max_profit = 0;
    int ans[MAX_M] = {0};
    
    // 枚举选1个产品的情况
    for (int i = 0; i < m; i++) {
        if (risks[i] <= X && limits[i] <= N) {
            int profit = rates[i] * limits[i];
            if (profit > max_profit) {
                max_profit = profit;
                for (int j = 0; j < m; j++) {
                    ans[j] = 0;
                }
                ans[i] = limits[i];
            }
        }
    }
    
    // 枚举选2个产品的情况
    for (int i = 0; i < m; i++) {
        for (int j = i+1; j < m; j++) {
        

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

最新华为OD机试-E+D卷 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD-E/D卷的题目汇总和(Java/Cpp/Python)三语言解析 + 部分题目提供OJ在线评测

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务