[NOIP2004 提高组] 津津的储蓄计划
题目描述
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 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
问题分析:
根据题目,津津每个月的零花钱和预算如下:
- 每月津津收到的零花钱: 每月月初津津都会收到300元的零花钱。
- 支出与存钱计划: 每月津津根据自己的预算花费一定的钱,并根据剩余的钱决定是否把整百的钱存入妈妈那里。每月剩余的整百金额存入妈妈那里,剩余不满100元的钱保留给自己。
- 透支检查: 如果月初津津的手头钱加上妈妈给的钱不足以支付预算,说明发生透支,程序需要立即输出发生透支的月份。
- 年末存款: 到了年末,津津能获得妈妈存款部分的20%利息,最后输出年末时津津手中所有的零花钱(包括利息)。
详细求解思路:
-
每个月的资金:
- 每个月初,津津的资金等于上个月剩余的钱加上300元。
- 如果预计月底剩余的钱大于等于100元,她会存入整百部分的钱,并且剩余的部分保留在自己手中。
- 如果透支(即资金不足以支付预算),直接输出月份。
-
年末计算:
- 年末时,计算津津存入妈妈那里部分的钱加上20%的利息,最终输出津津手中的钱。
变量解释:
-
int cost, save = 0, bank = 0;
cost
:存储每个月的预算(支出)。save
:存储津津手头的剩余钱。bank
:存储存入妈妈那里的钱,用于计算年末返还。
-
每月处理逻辑:
save += 300;
:每月津津都会收到300元零花钱。scanf("%d", &cost);
:输入当前月的预算(支出)。save -= cost;
:支付本月的预算,更新津津剩余的钱。if(save < 0) { printf("%d", 0 - i); return 0; }
:如果剩余的钱不足以支付预算,即发生透支,输出透支的月份(负数形式),并退出程序。if(save >= 100) { bank += 100 * (save / 100); save %= 100; }
:如果津津手中剩余的金额大于等于100元,将整百部分存入妈妈那里,存入的金额为save / 100 * 100
,剩余不足100元的部分保留在津津自己手中。
-
年末结算:
printf("%d", bank * 6 / 5 + save);
:到年末时,津津会获得存入妈妈那部分钱的20%的利息。bank * 6 / 5
相当于乘以1.2得到20%的利息。save
是津津手中剩余的钱。
代码解析:
#include<cstdio>
int cost, save = 0, bank = 0;
int main() {
int i;
for(i = 1; i <= 12; i++) {
save += 300; // 每个月津津都收到300元零花钱
scanf("%d", &cost); // 输入本月的预算
save -= cost; // 用津津的剩余资金支付预算
if(save < 0) {
printf("%d", 0 - i); // 如果津津透支,输出负数的月份
return 0; // 结束程序
}
if(save >= 100) {
bank += 100 * (save / 100); // 如果剩余钱大于等于100元,存入整百部分
save %= 100; // 更新津津自己手中的剩余钱
}
}
printf("%d", bank * 6 / 5 + save); // 年末津津能得到的总存款(包括20%的利息)
return 0;
}
代码示例(Java):
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cost, save = 0, bank = 0;
for (int i = 1; i <= 12; i++) {
save += 300; // 每个月津津都会得到300元
cost = sc.nextInt(); // 输入本月预算
save -= cost; // 用津津的剩余资金支付预算
if (save < 0) {
System.out.println(-i); // 如果透支,输出月份的负数
return;
}
if (save >= 100) {
bank += 100 * (save / 100); // 存入整百的钱
save %= 100; // 更新剩余的钱
}
}
System.out.println(bank * 6 / 5 + save); // 计算年末津津手中的钱
}
}
代码示例(C++):
#include <iostream>
using namespace std;
int main() {
int cost, save = 0, bank = 0;
for (int i = 1; i <= 12; i++) {
save += 300; // 每个月津津都会得到300元
cin >> cost; // 输入本月预算
save -= cost; // 用津津的剩余资金支付预算
if (save < 0) {
cout << -i << endl; // 如果透支,输出月份的负数
return 0;
}
if (save >= 100) {
bank += 100 * (save / 100); // 存入整百的钱
save %= 100; // 更新剩余的钱
}
}
cout << bank * 6 / 5 + save << endl; // 计算年末津津手中的钱
return 0;
}
代码示例(Python):
save = 0
bank = 0
for i in range(1, 13):
save += 300 # 每个月津津都会得到300元
cost = int(input()) # 输入本月预算
save -= cost # 用津津的剩余资金支付预算
if save < 0:
print(-i) # 如果透支,输出月份的负数
exit()
if save >= 100:
bank += 100 * (save // 100) # 存入整百的钱
save %= 100 # 更新剩余的钱
print(bank * 6 // 5 + save) # 计算年末津津手中的钱