1 条题解

  • 0
    @ 2025-4-9 22:38:14

    题意分析

    该问题要求帮助Ohgas先生选择最优的存款操作,以在给定年限后获得最大的资金总额。每个操作包含两种计息方式(简单利息或复利)及年操作费。需根据操作参数计算最终金额并选择最大值。

    解题思路

    1. 利息计算模型

    • 复利(Compound Interest)
      每年利息基于当前本金计算,利息加入本金后扣除操作费。公式:
      ( A_{新} = A_{旧} + \text{floor}(A_{旧} \times \text{rate}) - \text{charge} )

    • 简单利息(Simple Interest)
      每年利息基于当年本金(扣除操作费前)计算,利息单独累积,本金扣除操作费。最终金额为扣除操作费后的本金加上累积利息:
      ( A_{最终} = (A_{初始} - \text{charge} \times \text{年数}) + \sum (\text{floor}(A_{每年} \times \text{rate})) )

    2. 关键步骤

    1. 输入处理
      读取测试用例数,对每个数据集解析初始资金、年限、操作数及每个操作的参数(计息类型、利率、操作费)。

    2. 模拟计算每个操作

      • 复利:逐年更新本金,利息加入本金后扣除操作费。
      • 简单利息:累积每年的利息,本金逐年扣除操作费,最后加上总利息。
    3. 比较并输出最大值
      遍历所有操作的计算结果,记录最大值并输出。

    3. 注意事项

    • 利率精度:题目保证利率为 (1/8192) 的整数倍,可用双精度浮点数精确表示,无需处理精度误差。
    • 操作费扣除:保证本金足够支付,无需处理负数情况。
    • 整数截断:利息计算需截断小数部分(取整),与示例中的计算方式一致。

    代码实现

    #include <iostream>
    using namespace std;
    
    int main() {
        int cases;
        scanf("%d", &cases);
        while (cases--) {
            int fund, year, op, ans = -1;
            scanf("%d%d%d", &fund, &year, &op);
            while (op--) {
                int flag, charge;
                double rate;
                scanf("%d%lf%d", &flag, &rate, &charge);
                
                int current = fund; // 当前本金
                if (flag == 1) { // 复利
                    for (int i = 0; i < year; ++i) {
                        int interest = current * rate; // 截断利息
                        current = current + interest - charge;
                    }
                } else { // 简单利息
                    int cumulative = 0;
                    for (int i = 0; i < year; ++i) {
                        int interest = current * rate; // 利息基于扣除前本金
                        cumulative += interest;
                        current -= charge; // 扣除操作费
                    }
                    current += cumulative; // 最终加上累积利息
                }
                ans = max(ans, current);
            }
            printf("%d\n", ans);
        }
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:每个测试用例的时间复杂度为 (O(m \times n \times y)),其中 (m) 是测试用例数,(n) 是操作数,(y) 是年限。由于 (m \leq 100)、(n \leq 100)、(y \leq 10),总操作次数在 (10^5) 量级,效率足够。
    • 空间复杂度:仅需存储当前操作的计算结果,空间复杂度为 (O(1))。
    • 1

    信息

    ID
    1683
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者