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

news2025/1/19 2:55:38

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

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

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

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

相关文章

AIGC笔记--关节点6D位姿按比例融合

1--核心代码 6D位姿一般指平移向量和旋转向量&#xff0c;Maya软件中关节点的6D位姿指的是相对平移向量和欧拉旋转向量&#xff1b; 为了按比例融合两个Pose&#xff0c;首先需要将欧拉旋转向量转换为旋转矩阵&#xff0c;在将旋转矩阵转换为四元数&#xff0c;利用球面线性插值…

vcomp120.dll无法继续执行代码怎么解决

如何解决“缺失vcomp120.dll”错误&#xff1f;vcomp120.dll下载去哪下呢&#xff1f;当您尝试启动一个应用程序或游戏时&#xff0c;您可能会看到一个错误消息&#xff0c;显示“缺失vcomp120.dll”。这通常是因为vcomp120.dll未正确安装或文件已丢失或损坏。这篇文章将向您介…

C语言深入理解指针(2)

1.数组名的理解 #include <stdio.h> int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[0];//&arr[0]将数组首元素的地址放在p这个指针变量}int main() {int arr[10] {0};int* p1 &arr[0];int* p2 arr;//数组名是数组首元素的地址return …

为何虎茅掌柜 短短6个月会员近百万 月销售额破亿!

大家好 我是吴军 一家软件开发公司的产品经理 今天我们来分析一下&#xff0c;一个卖酒的模式 为什么这家平台短短6个月&#xff0c;发展百万名用户&#xff0c;月销售额破亿! 虎茅掌柜&#xff0c;切记这个虎茅和茅台的那个没有任何关系 虎茅掌柜 虎茅掌柜实质上是一种…

vue生命周期函数原理解析,vue阻止事件冒泡方法实现

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

如何实现固定公网地址远程SSH连接Linux Deepin系统

文章目录 前言1. 开启SSH服务2. Deppin安装Cpolar3. 配置ssh公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 前言 Deepin操作系统是一个基于Debian的Linux操作系统&#xff0c;专注于使用者对日常办公、学习、生活和娱乐的操作体验的极致&#xff0…

网络通信与IO多路复用

网络通信与IO多路复用 一、网络通信1.缓存1.1 网卡缓存1.2 内核缓存1.3 用户缓存 2.发送过程3.接收过程 二、IO通信模型1.阻塞IO2.非阻塞IO3.IO多路复用4.信号驱动IO5.异步IO 三、IO多路复用1.select机制1.1 底层原理1.2 底层机制1.3 优点1.4 缺点 2.poll机制2.1 底层原理2.2 底…

如何评估产品说明书的质量和有效性

评估产品说明书的有效性和质量涉及多个关键方面&#xff0c;这些方面共同决定了说明书是否能够满足用户的需求&#xff0c;提供准确、清晰且有价值的信息。以下是一些建议的评估步骤和标准&#xff1a; 1、完整性检查&#xff1a; 确保产品说明书涵盖了产品的所有关键功能和特…

Git如何清除账户凭证

场景&#xff1a;一般发生在Git用户变更的情况 1.git base 操作 Git会使用凭证助手 credential.helper来储存账户凭证&#xff0c;通过以下命令移除&#xff1a; git config --system --unset credential.helper 除了system系统级外&#xff0c;还有 global、local范围。 查…

引领短剧风尚,打造全新观影体验——短剧APP开发之旅

随着移动互联网的迅猛发展&#xff0c;短视频和短剧成为了大众休闲娱乐的新宠。为了满足用户对于高质量、快节奏内容的需求&#xff0c;我们决定开发一款全新的短剧APP&#xff0c;为用户带来前所未有的观影体验。 这款短剧APP将集合丰富多样的短剧资源&#xff0c;涵盖各种题…

运营干货 | TikTok店铺引流就看这几点

在 TikTok 上进行店铺引流可以是一种非常有效的营销策略&#xff0c;尤其是针对年轻用户群体。以下是一些在 TikTok 上进行店铺引流的技巧&#xff1a; 创作有趣的内容&#xff1a;在 TikTok 上&#xff0c;有趣和创意的内容往往更容易引起用户的注意。制作与你的品牌或产品相…

2024年Vue3 面试题小总结

Vue3 面试题小总结 1. OptionsAPI 与 CompositionAPI 的区别&#xff1f; OptionsAPI&#xff1a; 选项式API&#xff0c;通过定义data、computed、watch、method等属性与方法&#xff0c;共同处理页面逻辑&#xff1b;缺点&#xff1a; 当组件变得复杂的时候&#xff0c;导致…

基于安卓的移动视频监控系统的设计与实现

摘 要 随着网络通信技术和视频编解码技术的不断进步&#xff0c;视频监控系统也不断发展。目前&#xff0c;第三代视频监控技术即网络视频监控技术已经占据市场主流&#xff0c;人们对移动视频监控系统的市场需求也在日益扩大。与此同时&#xff0c;安卓智能手机市场飞速发展&…

CentOS7.9 Nginx + EMQX集群组建 MQTTS平台

前面我们有介绍过单机版EMQX的安装 CentOS7 安装 EMQX&#xff08;MQTT&#xff09;&#xff0c;今天我们来讲一下实际项目里用的到MQTTS平台。 一、EMQX单机配置 简单部署两个节点&#xff0c;修改对应配置文件 (/usr/local/emqx/etc/emqx.conf) 中的node内容&#xff1a; nam…

R语言绘制散点密度图ggdentity

使用R语言绘制二维密度图 下图是一张常见的二维核密度散点图&#xff0c;能够清晰直观的反映出数据之间的分布趋势&#xff0c;颜色越红的位置数据越集中分布。今天分享的笔记是在R语言中绘制该图的两种常见方法&#xff0c;提供过程代码。 论文中常见的这种展示两组数据之间分…

八、词嵌入语言模型(Word Embedding)

词嵌入&#xff08;Word Embedding, WE&#xff09;&#xff0c;任务是把不可计算、非结构化的词转换为可以计算、结构化的向量&#xff0c;从而便于进行数学处理。 一个更官方一点的定义是&#xff1a;词嵌入是是指把一个维数为所有词的数量的高维空间&#xff08;one-hot形式…

[SaaS] AI试衣间

就刚刚&#xff01;我在淘宝用AI试了1000件衣服~淘宝AI试衣间&#xff0c;1秒换装&#xff0c;立即解锁不一样的你&#xff01;https://mp.weixin.qq.com/s/mZiNmepoWddYaLbEaap1Ow

云服务器租用4核16G配置价格表,阿里云和腾讯云费用价格对比

4核16G服务器租用优惠价格26元1个月&#xff0c;腾讯云轻量4核16G12M服务器32元1个月、96元3个月、156元6个月、312元一年&#xff0c;阿腾云atengyun.com分享4核16服务器租用费用价格表&#xff0c;阿里云和腾讯云详细配置报价和性能参数表&#xff1a; 腾讯云4核16G服务器价…

Python读取Excel工作表数据写入CSV、XML、文本

Excel工作簿是常用的表格格式&#xff0c;许多数据呈现、数据分析和数据汇报都是以Excel工作表的形式进行。然而&#xff0c;在实际的数据管理、分析或自动化流程构建过程中&#xff0c;我们常常需要将这些Excel中的数据迁移至更其他数据系统&#xff0c;或者以文本形式存储以便…

qt5-入门-QTableWidget简单使用

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 效果代码头文件源文件可能遇到的问题只显示表头不显示内容 效果 填充一个列表&#xff0c;在列表中点击“颜色”一列&#xff0c;可…