津津的储蓄计划

GitHub跳转原题关系图返回列表

按月更新现金和整百储蓄,首个现金不足月输出负月份。

OJ: noi_openjudge

题目 ID: ch0105-22

难度:普及-

标签:模拟循环python

日期: 2026-07-30 23:01

题意

每月获得 300 元,按预算消费后存入所有整百金额;若首次现金不足,输出负月份,否则年末储蓄返还 120%。

思路

维护手头现金 cash 和已存金额 savings。每月先加 300 再扣预算,负数立即失败;否则将 cash // 100 * 100 存入妈妈处并保留余数。for...elseelse 只会在 12 个月没有 break 时执行,正好处理年末结算。

代码

Python代码

python
cash = 0
savings = 0

for month in range(1, 13):
    budget = int(input())
    cash += 300 - budget
    if cash < 0:
        print(-month)
        break
    savings += cash // 100 * 100
    cash %= 100
else:
    print(cash + int(savings * 1.2))

C++代码

cpp
mom = 0 # 所有给妈妈的钱,mom = 1 表示mom有100元
jinjin = 0 # 津津每个月剩余的钱,刚开始剩余0
flag = 0 #标志,0表示成功,>0表示那个月失败的
for i in range(1,12+1): # 12个月份,重复12次
    spend = int(input()) # 读取要花的钱
    jinjin = jinjin + 300 # 上个月剩余的钱加上妈妈的给的钱
    jinjin = jinjin - spend #  花去这个月应该花的钱
    if jinjin < 0 : # 钱不够
        flag= i # 设置失败的月份
        break
    # 没有失败,把整百的钱给mom
    mom = mom + jinjin // 100
    jinjin = jinjin % 100 # 自己留下不足100if flag > 0 :
    print(flag*-1)
else:
    # 最后剩余的钱 加上 mom返给的钱
    jinjin = jinjin + mom * 120
    print(jinjin)

复杂度

月份固定为 12,时间复杂度和额外空间复杂度均为 O(1)O(1)

总结

状态模拟题按题目时间顺序更新变量;for...else 适合区分“中途失败”和“正常完成”。