1 条题解
-
0
题意分析
该问题要求帮助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. 关键步骤
-
输入处理
读取测试用例数,对每个数据集解析初始资金、年限、操作数及每个操作的参数(计息类型、利率、操作费)。 -
模拟计算每个操作
- 复利:逐年更新本金,利息加入本金后扣除操作费。
- 简单利息:累积每年的利息,本金逐年扣除操作费,最后加上总利息。
-
比较并输出最大值
遍历所有操作的计算结果,记录最大值并输出。
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
- 上传者