虚拟游戏理财【华为OD机试-JAVAPythonC++JS】

news2024/11/17 23:36:11

题目描述

题目描述:
在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank,它提供有若干理财产品m,风险及投资回报不同,你有N(元)进行投资,能接受的总风险值为X。
你要在可接受范围内选择最优的投资方式获得最大回报。
说明:
在虚拟游戏中,每项投资风险值相加为总风险值;
在虚拟游戏中,最多只能投资2个理财产品;
在虚拟游戏中,最小单位为整数,不能拆分为小数;
投资额回报率=投资回报
输入描述:
第一行:产品数(取值范围[1, 20]),总投资额(整数,取值范围[1, 10000]),可接受的总风险(整数,取值范围[1, 200])
第二行:产品投资回报率序列,输入为整数,取值范围[1,60]
第三行:产品风险值序列,输入为整数,取值范围[1,100]
第四行:最大投资额度序列,输入为整数,取值范围[1,10000]
输出描述:
每个产品的投资额序列
补充说明:
在虚拟游戏中,每项投资风险值相加为总风险值;
在虚拟游戏中,最多只能投资2个理财产品;
在虚拟游戏中,最小单位为整数,不能拆分为小数;
投资额
回报率=投资回报
示例1
输入:
5 100 10
10 20 30 40 50
3 4 5 6 10
20 30 20 40 30
输出:
0 30 0 40 0
说明:
投资第二项30个单位,第四项40个单位,总的投资风险为两项相加为4+6=10

解题思路

  1. 输入处理: 读取输入,获取产品数、总投资额、可接受的总风险值以及各项指标的序列。

  2. 动态规划定义: 定义一个二维数组dp,其中dp[i][j]表示在前i个产品中选择不超过j总投资额的情况下,能够达到的最小总风险值。

  3. 状态转移方程: 对于第i个产品,有两个选择:不投资或者投资。若选择不投资,则dp[i][j] = dp[i-1][j];若选择投资,则dp[i][j] = dp[i-1][j-investment[i]] + risk[i],其中investment[i]为第i个产品的投资额,risk[i]为第i个产品的风险值。

  4. 递推填表:i=1n,从j=0total_investment,根据状态转移方程填充动态规划表。

  5. 构建最优解: 从填充好的动态规划表中反向追溯,得到最优解,即投资额序列。

  6. 输出结果: 输出每个产品的投资额序列。

这样的动态规划方法能够有效地找到在总投资额和总风险值限制下,获取最大回报的投资方式。

题解代码

理解你的需求,我会为Python、Java、C/C++和JavaScript分别提供相应的题解代码。

Python题解代码

number, N, X = map(int, input().split())
return_list = list(map(int, input().split()))
risk_list = list(map(int, input().split()))
max_cost_list = list(map(int, input().split()))

return_list.append(0)
risk_list.append(0)
max_cost_list.append(0)
number += 1

max_return = 0
max_status = ["0"] * number
max_return_risk = 0

for i in range(number):
    for j in range(i + 1, number):
        if risk_list[i] + risk_list[j] <= X:
            max_return_product_index = i if return_list[i] > return_list[j] else j
            other_return_product_index = i + j - max_return_product_index
            max_return_cost = min(N, max_cost_list[max_return_product_index])
            other_return_cost = min(N - max_return_cost, max_cost_list[other_return_product_index])
            cur_return = (
                return_list[max_return_product_index] * max_return_cost
                + return_list[other_return_product_index] * other_return_cost
            )
            if cur_return > max_return:
                max_return = cur_return
                max_return_risk = risk_list[i] + risk_list[j]
                max_dict = {
                    max_return_product_index: max_return_cost,
                    other_return_product_index: other_return_cost,
                }
                for k in range(number):
                    max_status[k] = str(max_dict.get(k, 0))
print(" ".join(max_status[:-1]))

Java题解代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();
        int N = scanner.nextInt();
        int X = scanner.nextInt();

        int[] returnList = new int[number];
        int[] riskList = new int[number];
        int[] maxCostList = new int[number];

        for (int i = 0; i < number; i++) {
            returnList[i] = scanner.nextInt();
        }

        for (int i = 0; i < number; i++) {
            riskList[i] = scanner.nextInt();
        }

        for (int i = 0; i < number; i++) {
            maxCostList[i] = scanner.nextInt();
        }

        int[] maxReturnStatus = getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList);
        for (int i = 0; i < number; i++) {
            System.out.print(maxReturnStatus[i] + " ");
        }
    }

    private static int[] getMaxReturnStatus(int number, int N, int X, int[] returnList, int[] riskList, int[] maxCostList) {
        number++;
        int[] returnListExtended = new int[number];
        int[] riskListExtended = new int[number];
        int[] maxCostListExtended = new int[number];

        System.arraycopy(returnList, 0, returnListExtended, 0, returnList.length);
        System.arraycopy(riskList, 0, riskListExtended, 0, riskList.length);
        System.arraycopy(maxCostList, 0, maxCostListExtended, 0, maxCostList.length);

        returnListExtended[number - 1] = 0;
        riskListExtended[number - 1] = 0;
        maxCostListExtended[number - 1] = 0;

        int maxReturn = 0;
        int maxReturnRisk = 0;
        int[] maxStatus = new int[number];

        for (int i = 0; i < number; i++) {
            for (int j = i + 1; j < number; j++) {
                if (riskListExtended[i] + riskListExtended[j] <= X) {
                    int maxReturnProductIndex = (returnListExtended[i] > returnListExtended[j]) ? i : j;
                    int otherReturnProductIndex = i + j - maxReturnProductIndex;
                    int maxReturnCost = Math.min(N, maxCostListExtended[maxReturnProductIndex]);
                    int otherReturnCost = Math.min(N - maxReturnCost, maxCostListExtended[otherReturnProductIndex]);
                    int curReturn = returnListExtended[maxReturnProductIndex] * maxReturnCost
                            + returnListExtended[otherReturnProductIndex] * otherReturnCost;
                    if (curReturn > maxReturn) {
                        maxReturn = curReturn;
                        maxReturnRisk = riskListExtended[i] + riskListExtended[j];
                        for (int k = 0; k < number; k++) {
                            maxStatus[k] = (k == maxReturnProductIndex) ? maxReturnCost
                                    : (k == otherReturnProductIndex) ? otherReturnCost : 0;
                        }
                    }
                }
            }
        }

        return maxStatus;
    }
}

C/C++题解代码

#include <iostream>
#include <vector>

using namespace std;

vector<int> getMaxReturnStatus(int number, int N, int X, vector<int> returnList, vector<int> riskList, vector<int> maxCostList) {
    number++;
    returnList.push_back(0);
    riskList.push_back(0);
    maxCostList.push_back(0);

    int maxReturn = 0;
    int maxReturnRisk = 0;
    vector<int> maxStatus(number, 0);

    for (int i = 0; i < number; i++) {
        for (int j = i + 1; j < number; j++) {
            if (riskList[i] + riskList[j] <= X) {
                int maxReturnProductIndex = (returnList[i] > returnList[j]) ? i : j;
                int otherReturnProductIndex = i + j - maxReturnProductIndex;
                int maxReturnCost = min(N, maxCostList[maxReturnProductIndex]);
                int otherReturnCost = min(N - maxReturnCost, maxCostList[otherReturnProductIndex]);
                int curReturn = returnList[maxReturnProductIndex] * maxReturnCost
                        + returnList[otherReturnProductIndex] * otherReturnCost;
                if (curReturn > maxReturn) {
                    maxReturn = curReturn;
                    maxReturnRisk = riskList[i] + riskList[j];
                    fill(maxStatus.begin(), maxStatus.end(), 0);
                    maxStatus[maxReturnProductIndex] = maxReturnCost;
                    maxStatus[otherReturnProductIndex] = otherReturnCost;
                }
            }
        }
    }

    return maxStatus;
}

int main() {
    int number, N, X;
    cin >> number >> N >> X;

    vector<int> returnList(number);
    vector<int> riskList(number);
    vector<int> maxCostList(number);

    for (int i = 0; i < number; i++) {
        cin >> returnList[i];
    }

    for (int i = 0; i < number; i++) {
        cin >> riskList[i];
    }

    for (int i = 0; i < number; i

++) {
        cin >> maxCostList[i];
    }

    vector<int> maxReturnStatus = getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList);

    for (int i = 0; i < number; i++) {
        cout << maxReturnStatus[i] << " ";
    }

    return 0;
}

JavaScript题解代码

function getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList) {
    number++;
    returnList.push(0);
    riskList.push(0);
    maxCostList.push(0);

    let maxReturn = 0;
    let maxReturnRisk = 0;
    const maxStatus = new Array(number).fill(0);

    for (let i = 0; i < number; i++) {
        for (let j = i + 1; j < number; j++) {
            if (riskList[i] + riskList[j] <= X) {
                const maxReturnProductIndex = (returnList[i] > returnList[j]) ? i : j;
                const otherReturnProductIndex = i + j - maxReturnProductIndex;
                const maxReturnCost = Math.min(N, maxCostList[maxReturnProductIndex]);
                const otherReturnCost = Math.min(N - maxReturnCost, maxCostList[otherReturnProductIndex]);
                const curReturn = returnList[maxReturnProductIndex] * maxReturnCost
                    + returnList[otherReturnProductIndex] * otherReturnCost;
                if (curReturn > maxReturn) {
                    maxReturn = curReturn;
                    maxReturnRisk = riskList[i] + riskList[j];
                    maxStatus.fill(0);
                    maxStatus[maxReturnProductIndex] = maxReturnCost;
                    maxStatus[otherReturnProductIndex] = otherReturnCost;
                }
            }
        }
    }

    return maxStatus;
}

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.question('', (input) => {
    const inputs = input.split(' ');
    const number = parseInt(inputs[0]);
    const N = parseInt(inputs[1]);
    const X = parseInt(inputs[2]);

    rl.question('', (input) => {
        const returnList = input.split(' ').map(Number);

        rl.question('', (input) => {
            const riskList = input.split(' ').map(Number);

            rl.question('', (input) => {
                const maxCostList = input.split(' ').map(Number);

                const maxReturnStatus = getMaxReturnStatus(number, N, X, returnList, riskList, maxCostList);

                console.log(maxReturnStatus.join(' '));
                rl.close();
            });
        });
    });
});

代码OJ评判结果

通过测试点

代码讲解

Python题解代码讲解

  1. 输入处理: 通过input()读取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 遍历组合: 使用两层循环遍历所有产品组合,计算它们的总风险和是否符合可接受风险。

  4. 判断最大回报: 对于符合条件的组合,计算它们的回报,并比较是否超过之前的最大回报。若是,则更新最大回报及相应的投资组合。

  5. 输出结果: 输出得到的最优投资组合的投资额序列。

Java题解代码讲解

  1. 输入处理: 使用Scanner读取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 调用函数: 调用getMaxReturnStatus函数,传递输入参数,并获取最优投资组合的投资额序列。

  4. 输出结果: 输出得到的最优投资组合的投资额序列。

C/C++题解代码讲解

  1. 输入处理: 使用cin读取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 调用函数: 调用getMaxReturnStatus函数,传递输入参数,并获取最优投资组合的投资额序列。

  4. 输出结果: 输出得到的最优投资组合的投资额序列。

JavaScript题解代码讲解

  1. 输入处理: 使用Node.js的readline模块逐行读取输入,获取产品数number、总投资额N、可接受总风险X以及各项指标序列。

  2. 数据初始化: 将输入的指标序列添加一个0,用于处理边界情况。同时,增加number变量。

  3. 调用函数: 调用getMaxReturnStatus函数,传递输入参数,并获取最优投资组合的投资额序列。

  4. 输出结果: 输出得到的最优投资组合的投资额序列。

寄语

🚀✨ 朋友,希望你的华为OD机试就像是一场轻松的技术party!愿你的代码如同畅快的音符,跳跃在键盘上,最后弹奏出一曲高分之歌。加油,你是技术舞台上的巨星!通过机试,就像是风轻云淡,轻轻松松就把高分收入囊中。祝愿你的编程之旅一路顺风,破风前行,每一行代码都是成功的注脚!🌈💻

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1479243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python:练习:编写一个程序,录入一个美元数量(int),然后显示出增加%5税率后的相应金额。

案例&#xff1a; 编写一个程序&#xff0c;录入一个美元数量&#xff08;int&#xff09;&#xff0c;然后显示出增加%5税率后的相应金额。格式如下所示&#xff1a; Enter an amount:100 With tax added:$105.0 思考&#xff1a; 1、录入一个美元数量&#xff0c;录入&am…

qt学习:实战 记事本 + 快捷键 + 鼠标滚轮 + 打开读取写入关闭文件

目录 功能 步骤 配置ui界面 添加图片资源 添加头文件和定义成员数据和成员函数 在构造函数里初始化 增加当前字体大小函数 减小当前字体大小函数 在用户按下 Ctrl 键的同时滚动鼠标滚轮时&#xff0c;执行放大或缩小操作 多选框变化后发出信号绑定槽函数来改变编码 …

flutter学习(一) 安装以及配置环境

首先需要下载flutter&#xff0c;然后解压 然后配置环境变量&#xff0c;配置到bin目录就行 配置完之后cmd运行flutter doctor 你就会发现&#xff0c;都是错 此时脑海里响起&#xff0c;卧槽&#xff0c;怎么回事&#xff0c;咋办 别着急&#xff0c;我教你。。。 问题 这…

【QQ案例-QQ框架-主流框架 Objective-C语言】

一、接下来,我们来做一下这个QQ, 1.接下来,我们来做一下这个QQ, QQ框架啊, 这个东西呢,我们管它叫做“主流框架”, 首先呢,要告诉大家一点,这个东西呢,我们管它,叫做“主流框架”, 算是一个简称啊, 只能说,这种框架的类型,上边儿带navigation,下边儿带tabb…

Linux centos 变更MySQL数据存储路径

Linux centos 变更MySQL数据存储路径 登录mysql&#xff0c;查看数据存储路径创建新目录准备迁移数据检查是否配置成功 登录mysql&#xff0c;查看数据存储路径 mysql -u root -pshow global variables like "%datadir%";创建新目录 查看磁盘空间 df -h选取最大磁…

论文阅读:2015ResNet深度残差网络(待补充)

top5错误率&#xff1a;每张图片算法都会给出它认为最可能的五个类别&#xff0c;五个里面有一个是正确则算法预测正确。 技术爆炸1&#xff1a;2012年&#xff0c;DL和CNN用于CV&#xff1b;技术爆炸2&#xff1a;2015年&#xff0c;超过人类水平&#xff0c;网络可以更深&…

Unity-PDF分割器(iTextSharp)

PDF分割器 Unity-PDF分割器前言核心思路解决过程一、Unity安装iTextSharp二、运行时计算将要生成文件的大小三、分割核心代码四、使用StandaloneFileBrowser五、其他的一些脚本六、游戏界面主体的构建MainWindowWarningPanel & FinishPanel By-Round Moon Unity-PDF分割器 …

Vue3 在SCSS中使用v-bind

template 先创建一个通用的页面结构 <template><div class"v-bubble-bg"></div> </template>js 在JS中先对需要用的数据进行定义&#xff1a; 可以是参数&#xff0c;也可以是data <script setup>const props defineProps({bgCol…

Linux零基础快速入门

Linux的诞生 Linux创始人:林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学期间 因为创始人在上大学期间经常需要浏览新闻和处理邮件&#xff0c;发现现有的操作系统不好用,于是他决心自己写一个保护模式下的操作系统&#xff0c;这就是Linux的原型&#xff0c;当时他…

【笔记】:更方便的将一个List中的数据传入另一个List中,避免多重循环

这里是 simpleInfoList 集合&#xff0c;记为集合A&#xff08;传值对象&#xff09; List<CourseSimpleInfoDTO> simpleInfoList courseClient.getSimpleInfoList(courseIds);if(simpleInfoListnull){throw new BizIllegalException("当前课程不存在!");}这…

[Flutter]TextButton自定义样式

在Flutter中&#xff0c;TextButton是一个简单的文本按钮&#xff0c;它遵循当前的Theme。如果你想要修改TextButton的样式&#xff0c;可以通过设置其style属性来实现&#xff0c;该属性接收一个ButtonStyle对象。 给TextButton和里面Text添加背景后&#xff0c;效果如下。可…

设计模式(二)单例模式

单例模式&#xff1a;确保一个类只有一个实例&#xff0c;并提供了全局访问点&#xff1b;主要是用于控制共享资源的访问&#xff1b; 单例模式的实现分为懒汉式和饿汉式。 懒汉式单例在需要时才会创建&#xff0c;而饿汉式单例则在类加载时立即创建实例&#xff1b; 单例模…

【精准获客,优化体验】Xinstall助力企业提升App渠道效果与用户满意度

在数字化时代&#xff0c;企业对于用户体验的重视程度日益提升。为了更好地满足用户需求&#xff0c;提供个性化、专属化的服务已经成为企业竞争的关键。今天&#xff0c;我们将向大家介绍一款名为Xinstall的一站式App全渠道统计服务商&#xff0c;它凭借强大的技术实力和丰富的…

【测试开发面试复习(一)】计算机网络:计算机网络体系结构(P1)补充ing

我每次复习的第一趴都是网络。。 一、高频面试题记录 1.1 计算机网络为什么要分层&#xff1f; 网络庞大而且复杂&#xff08;大量的软硬件系统、大量的程序和协议等&#xff09;&#xff0c;分层可提高整体结构的灵活性、将层次之间结构解耦&#xff0c;各层相互独立、隔离&…

轻松三步制作电子签名

一、在纸上签名&#xff0c;并且拍照。 二、新建空白word文档&#xff0c;使用WPS方式打开&#xff0c;再将图片复制进来。 三、点击图片&#xff0c;先选择【图片工具】中的【设置透明色】&#xff0c;然后点击签名之外的图片背景&#xff0c;即可制作为矢量图&#xff1b…

Redis 面试指南:常见问题及最佳答案

Redis 是一个高性能的键值存储系统&#xff0c;已经成为了许多企业和互联网公司的核心技术之一。本文将总结 Redis 面试中常见的问题&#xff0c;并提供最佳答案&#xff0c;以帮助读者更好地准备 Redis 面试。 引言&#xff1a; Redis 是一个开源、高性能、键值存储系统&…

朴素贝叶斯(带你从原理到实践)

目录 一、引言 二、朴素贝叶斯算法原理 1 贝叶斯定理 2 特征条件独立假设 3 分类过程 三、实践事例 四、朴素贝叶斯算法应用 1 文本分类 2 垃圾邮件过滤 3 情感分析 五、朴素贝叶斯算法未来发展 1 特征选择优化 2 半监督学习与无监督学习 3 结合深度学习 4 处理…

vue中动态引入图片

分析 很多时间&#xff0c;不管是vue2&#xff0c;还是vue3开发中都会遇到&#xff0c;动态渲染图片的功能&#xff0c;但是为什么我们直接将图片的路径直接赋值给变量的时候&#xff0c;图片渲染不出来&#xff0c;而通过require引入加载图片后却能正常渲染呢&#xff1f;主要…

数仓开发环境链接

这里写目录标题 1开发工具链接大数据组件1.1 启动hiveserver21.2配置DataGrip连接1.3测试使用 2 环境问题排查思路 1开发工具链接大数据组件 1.1 启动hiveserver2 数仓开发工具datagrip 需要用到JDBC协议链接到Hive&#xff0c;需要启动hiveserver2。 cd /opt/module/hive h…

PHP项目中composer和Git的组合使用

highlight: 在国内由于众所周知的原因&#xff0c;composer的package可能无法访问&#xff0c;解决办法是使用中国的全镜像&#xff1a; composer config -g repositories.packagist composer http://packagist.phpcomposer.com 在需要使用composer package的地方创建composer…