P1089 [NOIP 2004 提高组] 津津的储蓄计划 (洛谷)

1063 字
5 分钟
P1089 [NOIP 2004 提高组] 津津的储蓄计划 (洛谷)

题目描述#

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20%20\% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100100 元或恰好 100100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如 1111月初津津手中还有 8383 元,妈妈给了津津 300300 元。津津预计1111月的花销是 180180 元,那么她就会在妈妈那里存 200200 元,自己留下 183183 元。到了 1111 月月末,津津手中会剩下 33 元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据 2004200411 月到 1212 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 20042004 年年末,妈妈将津津平常存的钱加上 20%20\% 还给津津之后,津津手中会有多少钱。

输入格式#

1212 行数据,每行包含一个小于 350350 的非负整数,分别表示 11 月到 1212 月津津的预算。

输出格式#

一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 X-XXX 表示出现这种情况的第一个月;否则输出到 20042004 年年末津津手中会有多少钱。

注意,洛谷不需要进行文件输入输出,而是标准输入输出。

输入输出样例 #1#

输入 #1#

290
230
280
200
300
170
340
50
90
80
200
60

输出 #1#

-7

输入输出样例 #2#

输入 #2#

290
230
280
200
300
170
330
50
90
80
200
60

输出 #2#

1580

题解与分析#

解题突破口

这是一道纯粹的模拟题。我们只需要设定两个变量:一个记录津津手里当前的余钱 current_money,另一个记录存在妈妈那里的钱 saved_money。 然后按照 1121 \sim 12 个月的顺序依次进行模拟计算即可。

具体按月模拟的流程如下:

  1. 每个月月初,津津手里的钱增加 300 元。
  2. 减去当月的预算 budget
    • 如果此时手里的钱不够花(即 current_money < budget),说明计划失败,直接输出负的当前月份 -i 并结束程序。
    • 如果手里的钱够花,先扣除预算 current_money -= budget
  3. 结算剩余的钱,把“整百”的部分存给妈妈:
    • 可以利用整数除法的特性 (current_money / 100) * 100 来计算出能存多少钱。
    • 把这部分钱累加到 saved_money 中,并从 current_money 扣除。
  4. 如果 12 个月都顺利度过,最后输出 current_money + saved_money * 1.2 即可。

代码实现#

C++ 版本#

#include <iostream>
using namespace std;
int main() {
int current_money = 0; // 手里留存的钱
int saved_money = 0; // 存在妈妈那里的钱
int budget;
for (int i = 1; i <= 12; i++) {
cin >> budget;
current_money += 300; // 妈妈月初给的 300 元
if (current_money < budget) {
cout << -i << endl; // 出现不够用的情况,输出月份的负数并退出
return 0;
}
// 扣除预算
current_money -= budget;
// 计算能存多少整百的钱
int save = (current_money / 100) * 100;
saved_money += save;
current_money -= save;
}
// 年末返还 120%,加上手里剩下的钱
cout << current_money + saved_money * 1.2 << endl;
return 0;
}

Python 版本#

current_money = 0
saved_money = 0
failed = False
for i in range(1, 13):
budget = int(input())
current_money += 300
if current_money < budget:
print(-i)
failed = True
break
current_money -= budget
save = (current_money // 100) * 100
saved_money += save
current_money -= save
if not failed:
# 按照题目要求输出整数结果
print(int(current_money + saved_money * 1.2))
分类
标签
站点统计
文章
14
分类
4
标签
24
总字数
23,486
运行时长
0
最后活动
0 天前

文章目录