华为机考真题 -- 虚拟游戏理财

题目描述:

在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank,它提供有若干理财产品 m 个,风险及投资回报不同,你有 N(元)进行投资,能接收的总风险值为X。你要在可接受范围内选择最优的投资方式获得最大回报。

说明:
在虚拟游戏中,每项投资风险值相加为总风险值;
在虚拟游戏中,最多只能投资2个理财产品;
在虚拟游戏中,最小单位为整数,不能拆分为小数;
投资额*回报率=投资回报

输入描述:

第一行:产品数(取值范围[1,20]),总投资额(整数,取值范围[1, 10000]),可接受的总风险(整数,取值范围[1,20]);
第二行:产品投资回报率序列,输入为整数,取值范围[1,60];
第三行:产品风险值序列,输入为整数,取值范围[1,100];
第四行:最大投资额度序列,输入为整数,取值范围[1,100];

输出描述:

每个产品的投资额序列

示例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

C++源码:

#include <iostream>
using namespace std;

int main() {
    int n, N, X;
    int investmentReward[20], investmentRisk[20], investmentPrice[20];

    cin >> n >> N >> X;
    for (int i = 0; i < n; ++i) {
        cin >> investmentReward[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> investmentRisk[i];
    }
    for (int i = 0; i < n; ++i) {
        cin >> investmentPrice[i];
    }

    int maxInvestment = 0;
    int investments[20]{ 0 };
    for (int i = 0; i < n; ++i) {
        int c = (investmentPrice[i] <= N) ? investmentPrice[i] : N;
        if (investmentRisk[i] <= X && c * investmentReward[i] >= maxInvestment) {
            maxInvestment = c * investmentReward[i];
            fill(investments, investments + n, 0);
            investments[i] = c;
        }

        for (int j = i + 1; j < n; ++j) {
            if (investmentRisk[i] + investmentRisk[j] > X) continue;

            int a, b, sum = 0;
            if (investmentReward[i] >= investmentReward[j]) {
                a = (investmentPrice[i] <= N) ? investmentPrice[i] : N;
                b = (N - a >= investmentPrice[j]) ? investmentPrice[j] : N - a;
            }
            else {
                b = (investmentPrice[j] <= N) ? investmentPrice[j] : N;
                a = (N - b >= investmentPrice[i]) ? investmentPrice[i] : N - b;
            }

            sum = a * investmentReward[i] + b * investmentReward[j];
            if (sum >= maxInvestment) {
                maxInvestment = sum;
                fill(investments, investments + n, 0);
                investments[i] = a;
                investments[j] = b;
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        cout << investments[i] << " ";
    }
    cout << endl;
    system("pause");

    return 0;
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值