题目描述
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月末,津津手中会剩下33元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年11月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
输入格式
12行数据,每行包含一个小于350的非负整数,分别表示11月到12月津津的预算。
输出格式
一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X,X表示出现这种情况的第一个月;否则输出到2004年末津津手中会有多少钱。
输入输出样例
输入 #1290 230 280 200 300 170 340 50 90 80 200 60输出 #1
-7输入 #2
290 230 280 200 300 170 330 50 90 80 200 60输出 #2
1580
1 初步源程序代码: 2 #include<stdio.h> 3 int main() 4 { 5 int Pay[13]={0},Left[13]={0},i,F,save=0,sum=0; 6 for(i=1;i<13;i++) 7 scanf("%d",&Pay[i]);//Pay数组储存每个月津津的花销 8 for(i=1;i<13;i++){ 9 F=300+Left[i-1]-Pay[i];//计算每个月月初津津拥有的零花钱 10 if(F>=100&&F<200){ 11 save=100;//代表本月份可储存的金额 12 Left[i]=300+Left[i-1]-Pay[i]-save;//Left数组储存本月剩余的零花钱金额 13 }//津津手中拥有的零花钱在满足预算的基础上储存的零花钱金额,以此分情况讨论 14 else if(F>=200&&F<300) { 15 save=200; 16 Left[i]=300+Left[i-1]-Pay[i]-save; 17 } 18 else if(F>=300){ 19 save=300; 20 Left[i]=300+Left[i-1]-Pay[i]-save; 21 } 22 else{ 23 save=0; 24 Left[i]=300+Left[i-1]-Pay[i]; 25 } 26 if((300+Left[i-1])<Pay[i]) break;//若津津月初手中的零花钱总数不足本月花销,即刻退出循环,i记录月份 27 sum+=save;//sum记录储存零花钱总数 28 }//暴力枚举,每个月依次进行 29 int s=sum+sum*0.2+Left[12];//勿忘12月份末的零花钱余额 30 if(i==13) printf("%d",s); 31 else printf("-%d",i); 32 return 0; 33 }
1 网上简便源程序代码: 2 #include <stdio.h> 3 4 int main() 5 { 6 int g,a,b,c=0,d,r,m=0,n=0,h; 7 double l,q,x,y,v; 8 for(a=1;a<=12;a++){ 9 scanf("%d",&g); 10 h=300-g+c; 11 if(h<0){ 12 printf("-%d",a); 13 return 0; 14 } 15 b=h/100; 16 c=h%100; 17 m=m+b; 18 } 19 m*=120;m+=c; 20 printf("%d",m); 21 }
1 通过网上学习,优化初步代码,得到自己的代码: 2 #include<stdio.h> 3 int main() 4 { 5 int Pay[13]={0},Left[13]={0},i,F,save=0,sum=0; 6 for(i=1;i<13;i++) 7 scanf("%d",&Pay[i]); 8 for(i=1;i<13;i++){ 9 F=300+Left[i-1]-Pay[i]; 10 Left[i]=F%100;//通过取余操作,一步确定每个月零花钱的余额;同时包含的相较之前更加丰富 11 save=F-Left[i]; 12 sum+=save; 13 if(F<0) { 14 printf("-%d",i); 15 break; 16 } 17 } 18 int s=sum+sum*0.2+Left[12]; 19 if(i==13) printf("%d",s); 20 return 0; 21 }
本题的标签是暴力枚举,至于暴力枚举算法的详细知识内容,这里不在说明,通过本题也能深刻体会到,最大的感悟之处也莫过于此。读题->思考->代码实现->调试,整个过程是最传统的做题过程,如果出错的话,拿出笔和纸张按照代码自己模拟走一遍查出问题所在。标签:200,int,--,300,津津,枚举,save,Left From: https://www.cnblogs.com/wangyongxia-BK/p/16767558.html