虚拟游戏理财 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。

现有一家Bank,它提供有若干理财产品m,风险及投资回报不同,你有N (元)进行投资,能接受的总风,险值为X。

你要在可接受范围内选择最优的投资方式获得最大回报。

说明:

  • 在虚拟游戏中,每项投资风,险值相加为总风,险值;

  • 在虚拟游戏中,最多只能投资2个理财产品;

  • 在虚拟游戏中,最小单位为整数,不能拆分为小数;

  • 投资额*回报率=投资回报

输入描述

第一行:产品数(取值范围[1, 20]),总投资额(整数,取值范围[1,10000]),可接受的总风险(整数,取值范围[1,200])

第二行:产品投资回报率序列,输入为整数,取值范围[1,60]

第三行:产品风险值序列,输入为整数,取值范围[1,100]

第四行:最大投资额度序列,输入为整数,取值范围[1,10000]

输出描述

每个产品的投资序列

示例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. 初始化最大收益为0,创建一个空的字典rs用于存储最优投资数量。
    3. 遍历产品,对于每个产品:
      • 如果该产品的风险超过了可接受的总风险,则跳过该产品。
      • 计算只投资该产品时的投资数量,更新最大收益和最优投资数量。
      • 遍历剩余产品,计算两种产品组合的投资数量,更新最大收益和最优投资数量。
    4. 输出最优投资数量序列。
  • 时间复杂度:假设产品数为m,则时间复杂度为O(m^2)。
  • 空间复杂度:空间复杂度取决于存储最优投资数量的字典rs,最坏情况下为O(m)。

Java

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 产品数,总投资额,可接受的总风险
        int m = in.nextInt(), n = in.nextInt(), x = in.nextInt();
        in.nextLine(); // 忽略换行符

        // 产品投资回报率序列
        int[] reward = Arrays.stream(in.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        // 产品风险值序列
        int[] risk = Arrays.stream(in.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        // 最大投资额度序列
        int[] restrict = Arrays.stream(in.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        int maxReward = 0; // 最大收益
        Map<Integer, Integer> rs = new HashMap<>();
        for (int i = 0; i < m; i++) {
            if (risk[i] > x) continue;

            // 只购买 i 产品
            int k = Math.min(restrict[i], n);
            if (reward[i] * k > maxReward) {
                rs.clear();
                rs.put(i, k);
                maxReward = reward[i] * k;
            }

            for (int j = i + 1; j < m; j++) {
                if (risk[i] + risk[j] > x) continue;

                int cnti = restrict[i], cntj = restrict[j];
                if (reward[i] > reward[j]) {
                    cnti = Math.min(cnti, n);
                    cntj = Math.min(cntj, n - cnti);
                } else {
                    cntj = Math.min(cntj, n);
                    cnti = Math.min(cnti, n - cntj);
                }

                if (reward[i] * cnti + reward[j] * cntj > maxReward) {
                    rs.clear();
                    rs.put(i, cnti);
                    rs.put(j, cntj);
                    maxReward = reward[i] * cnti + reward[j] * cntj;
                }
            }
        }

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < m; i++) {
            builder.append(rs.getOrDefault(i, 0)).append(" ");
        }

        System.out.println(builder.toString());
    }


}

Python

# 导入必要的模块
from collections import defaultdict

# 获取输入数据
m, n, x = map(int, input().split())
reward = list(map(int, input().split()))
risk = list(map(int, input().split()))
restrict = list(map(int, input().split()))

max_reward = 0  # 最大收益
rs = defaultdict(int)  # 存储最优方案

for i in range(m):
    if risk[i] > x:
        continue

    # 只购买第 i 个产品
    k = min(restrict[i], n)
    if reward[i] * k > max_reward:
        rs.clear()
        rs[i] = k
        max_reward = reward[i] * k

    for j in range(i + 1, m):
        if risk[i] + risk[j] > x:
            continue

        cnti, cntj = restrict[i], restrict[j]
        if reward[i] > reward[j]:
            cnti = min(cnti, n)
            cntj = min(cntj, n - cnti)
        else:
            cntj = min(cntj, n)
            cnti = min(cnti, n - cntj)

        if reward[i] * cnti + reward[j] * cntj > max_reward:
            rs.clear()
            rs[i] = cnti
            rs[j] = cntj
            max_reward = reward[i] * cnti + reward[j] * cntj

# 输出最优方案
result = ' '.join(str(rs[i]) if i in rs else '0' for i in range(m))
print(result)

C++

#include <algorithm>
#include <iostream>
#include <unordered_map>
#include <vector>


using namespace std;

int main()
{
    int m, n, x;
    cin >> m >> n >> x;

    // 用于存储投资回报率、风险和产品投资限制的数组
    vector<int> reward(m);
    vector<int> risk(m);
    vector<int> restrict(m);

    // 读取投资回报率
    for (int i = 0; i < m; i++) {
        cin >> reward[i];
    }

    // 读取风险值
    for (int i = 0; i < m; i++) {
        cin >> risk[i];
    }

    // 读取投资限制
    for (int i = 0; i < m; i++) {
        cin >> restrict[i];
    }

    int                     maxReward = 0;   // 最大收益
    unordered_map<int, int> rs;              // 存储最优投资数量的映射

    for (int i = 0; i < m; i++) {
        if (risk[i] > x) continue;

        // 只投资于产品 i
        int k = min(restrict[i], n);
        if (reward[i] * k > maxReward) {
            rs.clear();
            rs[i]     = k;
            maxReward = reward[i] * k;
        }

        for (int j = i + 1; j < m; j++) {
            if (risk[i] + risk[j] > x) continue;

            int cnti = restrict[i], cntj = restrict[j];
            if (reward[i] > reward[j]) {   // i,j 谁回报率高优先投谁
                cnti = min(cnti, n);
                cntj = min(cntj, n - cnti);
            } else {
                cntj = min(cntj, n);
                cnti = min(cnti, n - cntj);
            }

            if (reward[i] * cnti + reward[j] * cntj > maxReward) {
                rs.clear();
                rs[i]     = cnti;
                rs[j]     = cntj;
                maxReward = reward[i] * cnti + reward[j] * cntj;
            }
        }
    }

    // 输出每个产品的最优投资数量
    for (int i = 0; i < m; i++) {
        cout << rs[i] << " ";
    }
    cout << endl;

    return 0;
}

‍❤️‍有考友通过专栏已经快速通过机考,都是原题哦~~ 💪

📝 订阅 http://t.csdnimg.cn/lifXk

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将SQL数据库转换为Mysql数据库

一、准备工作 1、SQL server安装包与已经有数据的mdf、ldf数据库文件&#xff1b; 2、.net Framework安装包&#xff1b;&#xff08;用于支持SQL Server安装的组件&#xff09; 3、MySql安装包&#xff1b;&#xff08;用于目标数据库的环境安装&#xff09; 4、navicat安装包…

YOLOv8旋转目标检测实战:训练自己的数据集

课程链接&#xff1a;https://edu.csdn.net/course/detail/39393 旋转目标检测是计算机视觉领域的一个高级任务&#xff0c;它在传统目标检测的基础上进一步发展。传统目标检测技术主要关注于识别和定位图像中的物体&#xff0c;通常以水平边界框(HBB)来标识目标物体的位置。而…

SpringBoot高级

1.自动配置-Condition Condition是Spring4.0后引入的条件化配置接口&#xff0c;通过实现Condition接口可以完成有条件的加载相应的Bean 进入 SpringBoot 启动类&#xff0c;点击进入 run() 可以看到这个方法是有返回值的&#xff0c;返回值为 ConfigurableApplicationConte…

[Redis]——主从同步原理(全量同步、增量同步)

目录 Redis集群&#xff1a; 主从同步原理&#xff1a; replid和offset: 全量同步和增量同步&#xff1a; repl_baklog文件&#xff1a; 主从集群的优化&#xff1a; Redis集群&#xff1a; 部署多台Redis我们称之为Redis集群&#xff0c;他有一个主节点(负责写操作)&…

什么是施密特触发器?一文详解

施密特触发器的定义 施密特触发器&#xff08;Schmitt Trigger&#xff09;是一种电子电路&#xff0c;常用于数字逻辑电路和信号处理电路中。它具有两个不同的阈值电压级别&#xff0c;通过这些不同的电压级别&#xff0c;可以将输入信号转换为相对稳定的输出信号。 当输入信…

【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频

Sambert-Hifigan模型介绍 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预测、文本转音素和韵律预测等模块&am…

Django之Form组件

Django之Form组件 目录 Django之Form组件介绍手动渲染错误信息基于Form组件校验数据重写错误信息用户名与密码radioSelect单选Select多选Select单选checkbox多选checkbox 前端渲染 介绍 Form组件提供了一种在网页上收集用户输入数据并将其提交到服务器进行处理的机制&#xff…

实战纪实 | 记一次绕过宝塔的的文件上传

前几天找到个可以上传任意文件的上传点&#xff0c;成功上传phpinfo页面并能访问&#xff0c;但是不能成功上传一句话&#xff0c;发现这台主机装了宝塔&#xff0c;经过反复尝试终于成功上传一句话并连接。 0x01 漏洞发现 结果前期摸索&#xff0c;发现了一个上传点&#xff0…

Java中 常见的开源树库介绍

阅读本文之前请参阅------Java中 树的基础知识介绍 在 Java 中&#xff0c;有几种流行的开源树库&#xff0c;它们提供了丰富的树算法和高级操作&#xff0c;可以帮助开发者更高效地处理树相关的问题。以下是几种常见的 Java 树库及其特点和区别&#xff1a; JTree 特点…

一场“猜成绩”大赛:ArrayList vs. LinkedList

今天我们将带来一场精彩绝伦的较量——ArrayList对阵LinkedList。 ArrayList它就像是一张大桌子&#xff0c;可以容纳各种各样的物品。 ArrayList是一个动态数组&#xff0c;具有随机访问的能力&#xff0c;这意味着我们可以在O(1)的时间复杂度内访问任意位置的元素。 它还具…

从零开始的LLaMA-Factory的指令增量微调

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

TinTin Web3 动态精选:以太坊坎昆升级利好 Layer2,比特币减半进入倒计时

TinTin 快讯由 TinTinLand 开发者技术社区打造&#xff0c;旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位&#xff0c; 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态&#xff0c;将有助于 TinTinLand 社区的开…

促合作 | 遵义医科大学珠海校区老师一行莅临全视通参观交流

近日&#xff0c;遵义医科大学珠海校区&#xff08;简称“遵医”&#xff09;护理学系副主任李佳、大学生创新创业中心主任王燕&#xff0c;携同校内多位教师&#xff0c;共赴珠海全视通信息技术有限公司&#xff08;简称“全视通”&#xff09;进行参观交流。此次来访旨在深化…

【刷题训练】LeetCode125. 验证回文串

验证回文串 题目要求 示例 1&#xff1a; 输入: s “A man, a plan, a canal: Panama” 输出&#xff1a;true 解释&#xff1a;“amanaplanacanalpanama” 是回文串。 示例 2&#xff1a; 输入&#xff1a;s “race a car” 输出&#xff1a;false 解释&#xff1a;“rac…

mysql数据库:使用 bash脚本 + 定时任务 自动备份数据

mysql数据库&#xff1a;使用 bash脚本 定时任务 自动备份数据 1、前言2、为什么需要自动化备份&#xff1f;3、编写备份脚本4、备份脚本授权5、添加定时任务6、重启 crond / 检查 crond 服务状态7、备份文件检查 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏…

Flutter学习笔记---flutter环境搭建以及dart语法的学习

Flutter笔记 Flutter环境搭建 获取 Dart SDK | Dart dart-pub | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror Flutter、Dart SDK镜像资源 - 掘金 (juejin.cn) Index of /flutter/dart-archive/channels/stable/release/3.2.6/sdk/ | 清华大学…

在webapp中手动发布一个应用

目录 第一步找到wedapps文件 第二步在wedapps文件自定义创建一个文件夹 第三步在自定义的文件夹里写一个HTMl文件 第四步进bin文件找到startup打开服务器​编辑 第五步打开浏览器输入网址http://localhost:8080//demoApp//index.htmlhttp://localhost:8080//文件和后缀名 第…

微信每天通过好友上限是多少个呢?

微信每天通过好友上限是多少个呢&#xff1f; 1、新号和不活跃的号 微信新号是指注册不满15十五天&#xff0c;或者注册超过15天&#xff0c;但是没有好好养号的的账号。&#xff08;包括很多长期不活跃的账号&#xff0c;突然使用的情况&#xff09; 2、正常帐号 &#xf…

ABAP-SE16N查询底表使用自己的布局

ABAP-SE16N查询底表使用自己的布局 调整好列的位置和顺序之后&#xff0c;可以保存自己的布局&#xff0c;点击“布局”按钮&#xff0c;点击“保存布局”&#xff1a; 特定于用户&#xff1a;是只对自己有效 缺省&#xff1a;会影响所有用户 在代码里面是这样的&#xff1a;…

Android和IOS应用开发-Flutter 应用中实现记录和使用全局状态的几种方法

文章目录 在Flutter中记录和使用全局状态使用 Provider步骤1步骤2步骤3 使用 BLoC步骤1步骤2步骤3 使用 GetX&#xff1a;步骤1步骤2步骤3 在Flutter中记录和使用全局状态 在 Flutter 应用中&#xff0c;您可以使用以下几种方法来实现记录和使用全局状态&#xff0c;并在整个应…