按月更新现金和整百储蓄,首个现金不足月输出负月份。
OJ: noi_openjudge
题目 ID: ch0105-22
难度:普及-
标签:模拟循环python
日期: 2026-07-30 23:01
题意
每月获得 300 元,按预算消费后存入所有整百金额;若首次现金不足,输出负月份,否则年末储蓄返还 120%。
思路
维护手头现金 cash 和已存金额 savings。每月先加 300 再扣预算,负数立即失败;否则将 cash // 100 * 100 存入妈妈处并保留余数。for...else 的 else 只会在 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 # 自己留下不足100的
if flag > 0 :
print(flag*-1)
else:
# 最后剩余的钱 加上 mom返给的钱
jinjin = jinjin + mom * 120
print(jinjin)复杂度
月份固定为 12,时间复杂度和额外空间复杂度均为
总结
状态模拟题按题目时间顺序更新变量;for...else 适合区分“中途失败”和“正常完成”。