hi,我是小汉堡,今天我们讲一下津津的储蓄计划这道题,废话不说,全是干货
题目链接
题目
题目描述
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 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
题目分析
这道题有些长,我给大家说句简单的(但还是建议自己读):给你12个数,表示津津在12个月每个月画的钱,因为预估就是实际,题上说的。然后,每个月妈妈都会给津津300元,津津画完这些钱之后会把剩余的整百存进妈妈那里,如果中间某个月津津剩余的钱加上300元不够她这个月花了,那就输出 − 这个月 -这个月 −这个月,如果到年底都够花,那妈妈就把存在她那里的钱乘上1.2还给津津
方法一
先输入津津每个月的花销,存在数组里,接下来遍历数组,判断这个月的钱够不够用,不够用输出 − 这个月 -这个月 −这个月,够用就花钱,存钱
代码
#include<bits/stdc++.h>
using namespace std;
int a[13];
int main(){
for(int i=1;i<=12;i++)
cin>>a[i];
int z=0,y=0;
int flag=0;
for(int i=1;i<=12;i++){
if(300+z<a[i]){
flag=i;
break;
}
y+=((300+z-a[i])/100)*100;
z=(300+z-a[i])%100;
}
if(flag!=0){
cout<<"-"<<flag;
return 0;
}
cout<<(y+y*0.2)+z;
return 0;
}
解释
你们最好自己读懂代码
6~7行:先循环12遍,输入12个月的花销
8行:定义两个变量,z表示这个月省的钱,1月开始没钱,所以初始化为0;y表示目前妈妈银行其实不是银行那里存的钱,目前没存钱,所以初始化为0。
10~17行:循环12遍,遍历每个月的花销,计算出y在年底的值,以及津津剩下的钱。里面先是一个判断, 300 + z < a [ i ] 300+z<a[i] 300+z<a[i],上个月剩下的钱 + + + 妈妈这个月给津津的300元小不小与津津这个月的花销(有点绕嘴,多读几遍,并揣摩一下意思)。如果小于:说明这个月不够花了,那就输出 − 这个月 -这个月 −这个月,让 f l a g = i flag=i flag=i,然后break,你一会儿就会知道 f l a g flag flag的作用。否则:继续执行 f o r for for。
15行:改变y的值, 300 + z − a [ i ] 300+z-a[i] 300+z−a[i]表示这个月剩的钱, 因为要求存在妈妈银行的钱是整百,所以 ÷ 100 {\div100} ÷100,代表里面有几个一百,举个例子: 489 ÷ 100 = 4 489{\div}100=4 489÷100=4,有4个100,所以式子正确。在最后 × 100 \times100 ×100,因为有几个100不是最终答案,要 × 100 \times100 ×100才是有多少钱要存。最终加进y里
16行:存新的z的值, 剩下的钱 m o d 100 剩下的钱mod100 剩下的钱mod100就是最终剩下的钱。
18~21行:判断flag是否为0,为0:说明没有不够花的月份,因为只有进了for里的判断,flag才会变。直接输出-flag,因为flag变的话,会变成不够花的那个月份,看第12行你就懂了。然后return 0,结束程序,下面不用加else,就不会被执行到。
22行:如果刚才没进去,就不会return 0,这里就能执行,输出升值后的y,以及12月剩下的钱,就是津津一年后剩下的钱。
方法二
方法一的优化,把输入与计算合并在一起
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int z=0,y=0,flag=0;
for(int i=1;i<=12;i++){
int n;
cin>>n;
if(300+z<n){
flag=i;
break;
}
y+=((300+z-n)/100)*100;
z=(300+z-n)%100;
}
if(flag!=0){
cout<<"-"<<flag;
return 0;
}
cout<<(y*1.2)+z;
return 0;
}
解释
这里不用解释了,思路和方法一相同
于是我们AC了
总结
这是一道模拟题,比比较简单,适合刚学完顺序结构、分支结构、循环结构的同学。津津真是个理财专家呀,其实是你,你帮津津理财了。好了,我是小汉堡,感谢阅读,可以点个关注吗?