最新华为OD机试真题-虚拟理财游戏(100分)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员
✨ 本系列打算持续跟新 华为OD机试-D卷 的三语言AC题解
👏 感谢大家的订阅➕ 和 喜欢💗
📎在线评测链接
🌍 评测功能需要订阅专栏后私信联系清隆解锁~
🌍 评测功能需要 =>订阅专栏<= 后联系清隆解锁~
🍓OJ题目截图
🕹 虚拟理财游戏
题目描述
在一款虚拟游戏中,玩家需要通过投资来增加自己的资产,以免被淘汰出局。游戏中有一家银行提供 个理财产品,每个产品的风险和投资回报不同。玩家拥有
元的初始资金,可以接受的总风险值为
。
为了在游戏中取得胜利,玩家需要在可接受的风险范围内,选择最优的投资方式以获得最大回报。游戏规则如下:
- 每项投资的风险值相加为总风险值。
- 玩家最多只能投资
个理财产品。
- 投资金额必须为整数,不能拆分为小数。
- 投资回报 = 投资金额 × 回报率。
现在请你帮助玩家设计一个最佳的投资策略。
输入格式
第一行包含三个整数 、
和
,分别表示理财产品数量、总投资金额和可接受的风险值。
第二行包含 个整数,表示每个理财产品的投资回报率。
第三行包含 个整数,表示每个理财产品的风险值。
第四行包含 个整数,表示每个理财产品的最大投资额度。
输出格式
输出一行,包含 个整数,表示在每个理财产品上的投资金额。如果不投资某个产品,则对应的投资金额为
。
样例输入
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&D卷 文章被收录于专栏
本专栏给大家提供了华为2024最新华为OD-C/D卷的题目汇总和(Java/Cpp/Python)三语言解析 + 提供OJ在线评测