信奥赛CSP-J复赛集训(模拟算法专题)(3):P1089 [NOIP 2004 提高组] 津津的储蓄计划
题目描述
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 300 300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20 % 20\% 20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 100 100 元或恰好 100 100 100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如 11 11 11月初津津手中还有 83 83 83 元,妈妈给了津津 300 300 300 元。津津预计 11 11 11月的花销是 180 180 180 元,那么她就会在妈妈那里存 200 200 200 元,自己留下 183 183 183 元。到了 11 11 11 月月末,津津手中会剩下 3 3 3 元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据 2004 2004 2004 年 1 1 1 月到 12 12 12 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 2004 2004 2004 年年末,妈妈将津津平常存的钱加上 20 % 20\% 20% 还给津津之后,津津手中会有多少钱。
输入格式
12 12 12 行数据,每行包含一个小于 350 350 350 的非负整数,分别表示 1 1 1 月到 12 12 12 月津津的预算。
输出格式
一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 − X -X −X, X X X 表示出现这种情况的第一个月;否则输出到 2004 2004 2004 年年末津津手中会有多少钱。
注意,洛谷不需要进行文件输入输出,而是标准输入输出。
输入输出样例 #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
AC代码:
#include<bits/stdc++.h>
using namespace std;int x; // 每个月的开销
int y; // 上个月剩余的钱(未存入妈妈账户的零钱)
int ans; // 累计存入妈妈那里的钱(整百存储)int main() {for (int i = 1; i <= 12; i++) { // 处理12个月的数据cin >> x; // 输入当前月的开销// 检查上个月剩余的钱(y) + 本月300元是否不足以支付本月开销if (y + 300 < x) {cout << "-" << i; // 不足则输出当前月份并结束程序return 0;}// 计算当前月能存多少整百的钱// (y + 300 - x)是总剩余,整除100得到整百的数量int q1 = (y + 300 - x) / 100;if (q1 > 0) { // 如果存在可存的整百金额ans += q1 * 100; // 将整百的钱存入妈妈那里}// 更新本月剩余的钱:总剩余(y+300-x)减去存的钱(q1*100)// 等价于取模100,保留零钱部分y = (y + 300 - x) % 100;}// 输出最终结果:剩余零钱(y) + 存款与利息(ans * 1.2)// 注意:ans是整百总和,利息为20%,所以总金额为 ans*1.2 + ycout << y + ans * 1.2;return 0;
}
代码功能分析:
-
变量说明:
x
:记录每个月的开销。y
:存储上个月剩余的零钱(未存入妈妈账户的部分)。ans
:累计存入妈妈账户的整百金额总和。
-
循环处理每月数据:
- 遍历12个月,逐月输入开销
x
。 - 资金不足判断:若上个月剩余的钱
y
加上本月300元不足以支付本月开销,直接输出负的当前月份并终止程序。
- 遍历12个月,逐月输入开销
-
存款计算:
- 计算本月总剩余资金
(y + 300 - x)
。 - 将总剩余资金中整百的部分存入妈妈账户(
q1 * 100
),并更新累计存款ans
。 - 剩余零钱更新为总剩余资金对100取模的结果,即
y = (y + 300 - x) % 100
。
- 计算本月总剩余资金
-
年终结算:
- 输出最终总金额,包括妈妈账户中的本金与20%利息(
ans * 1.2
)以及手中剩余的零钱y
。
- 输出最终总金额,包括妈妈账户中的本金与20%利息(
关键逻辑验证:
- 资金不足判定:正确判断当月是否会出现赤字,确保及时输出错误月份。
- 整百存款计算:通过整除和取模操作精确处理存款与零钱,避免误差。
- 利息计算:整百存款的20%利息通过
ans * 1.2
正确实现,与剩余零钱相加得到最终结果。
文末彩蛋:
关注并查看老师的个人主页,学习完整csp信奥赛完整系列课程: https://edu.csdn.net/lecturer/7901