最新华为OD机试真题-虚拟理财游戏(100分)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新 华为OD机试-D卷 的三语言AC题解

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

=> 虚拟理财游戏(100分) <=

🌍 评测功能需要订阅专栏后私信联系清隆解锁~

华为OD

🌍 评测功能需要 =>订阅专栏<= 后联系清隆解锁~

🍓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

数据范围

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

题解

可以暴力枚举所有的投资组合,并计算每种组合的总风险值和总回报。在满足风险值不超过 且投资总额不超过 的情况下,选择总回报最大的组合作为最优投资策略。

参考代码

  • Python
n, total, mx_risk = map(int, input().split())
returns = list(map(int, input().split()))
risks = list(map(int, input().split()))
limits = list(map(int, input().split()))

n = len(returns)
max_return = 0
best_invest = [0] * n

for i in range(n):
    inv1 = min(total, limits[i])
    r1 = returns[i] * inv1
    
    if risks[i] <= mx_risk and r1 > max_return:
        max_return = r1
        best_invest = [0] * n
        best_invest[i] = inv1
    
    for j in range(i+1, n):
        if risks[i] + risks[j] <= mx_risk:
            inv2 = min(total - inv1, limits[j])
            r2 = returns[j] * inv2
            
            if inv1 + inv2 <= total and r1 + r2 > max_return:
                max_return = r1 + r2
                best_invest = [0] * n  
                best_invest[i] = inv1
                best_invest[j] = inv2

print(*best_invest)
  • Java
import java.util.Scanner;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int total = scanner.nextInt();
        int k = scanner.nextInt();

        int[] hb = new int[n];
        int[] fx = new int[n];
        int[] tze = new int[n];
        int[] ans = new int[n];

        for (int i = 0; i < n; i++) {
            hb[i] = scanner.nextInt();
        }
        for (int i = 0; i < n; i++) {
            fx[i] = scanner.nextInt();
        }
        for (int i = 0; i < n; i++) {
            tze[i] = scanner.nextInt();
        }

        ArrayList<Integer> res = new ArrayList<>();
        int zhb = 0;

        for (int i = 0; i < n; i++) {
            int zhb1 = hb[i] * tze[i];
            if (fx[i] <= k && tze[i] <= total) {
                if (zhb1 > zhb) {
                    zhb = zhb1;
                    res.clear();
                    res.add(i);
                }
            }
            for (int j = i + 1; j < n; j++) {
                if (fx[i] + fx[j] <= k && tze[i] + tze[j] <= total) {
                    int zhb2 = hb[j] * tze[j];
                    if (zhb1 + zhb2 > zhb) {
                        zhb = zhb1 + zhb2;
                        res.clear();
                        res.add(i);
                        res.add(j);
                    }
                }
            }
        }

        for (int idx : res) {
            ans[idx] = tze[idx];
        }

        for (int val : ans) {
            System.out.print(val + " ");
        }
        System.out.println();

        scanner.close();
    }
}

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

int main() {
    int n, total, k;
    cin >> n >> total >> k;
    vector<int> hb(n), fx(n), tze(n), ans(n, 0);

    for (int i = 0; i < n; ++i) {
        cin >> hb[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> fx[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> tze[i];
    }

    vector<int> res;
    int zhb = 0;

    for (int i = 0; i < n; ++i) {
        int zhb1 = hb[i] * tze[i];
        if (fx[i] <= k && tze[i] <= total) {
            if (zhb1 > zhb) {
                zhb = zhb1;
                res = {i};
            }
        }
        for (int j = i + 1; j < n; ++j) {
            if (fx[i] + fx[j] <= k && tze[i] + tze[j] <= total) {
                int zhb2 = hb[j] * tze[j];
                if (zhb1 + zhb2 > zhb) {
                    zhb = zhb1 + zhb2;
                    res = {i, j};
                }
            }
        }
    }

    for (int idx : res) {
        ans[idx] = tze[idx];
    }

    for (int val : ans) {
        cout << val << " ";
    }
    cout << endl;

    return 0;
}

#华为od##华为od题库##华为##秋招##笔试#
最新华为OD机试-C&amp;D卷 文章被收录于专栏

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

全部评论

相关推荐

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