author:&Carlton
tags:NOIP,模拟,枚举
language:C++
topic:入门题题解— —津津的储蓄计划
website:P1089 [NOIP2004 提高组] 津津的储蓄计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
date:2023年7月11日
津津的储蓄计划
个人思路与感受
比较简单的一道模拟、枚举题,算法设计并不困难,一点点分情况写下来就好了。
但我犯了两个严重错误,导致了几次Compile Error 和Unaceepted。
①关键字误用
我误用了关键字final,导致编译失败。
②输入输出不符合要求
输入输出和循环体的关系没弄好,导致输入一次数据有一个输出结果或者输入数据后有多个输出结果,都是不符题意的。
哦哦,注意输出的月份是负数形式(注意题目的细节)
👇这是源代码
#include <iostream>
using namespace std;
int main()
{
int i,month,budget[12];
int money=0,save=0,flag=1;
float money_end;
for(i=0;i<12;i++)
{
cin>>budget[i];
}
for(i=0;i<12;i++)
{
money+=300;
money-=budget[i];
//风险情况
if(money<0)
{
month=i+1; //记录月份
flag=0; //标记是出问题了
break;
}
//正常情况
else
{
//若多于100,存!
while(money>=100)
{
money-=100;
save+=100;
}
}
}
//根据情况输出
if(flag)
{
money_end=money+save*1.2;
cout << money_end << endl;
}
else
{
cout << -month << endl;
}
return 0;
}
优秀的题解和思路
合理用int整数类型的运算特性(取整),同时善于利用取余等等运算,省去判断是否money大于100,用一个表达式涵盖两个情况。
#include<cstdio>
int main(){
int c,s=0,h=0; //c=每个月花的钱,s=自己手里的钱,h=存给麻麻的红色毛爷爷数量
for(int i=1;i<=12;i++) //从一月循环到十二月
{
scanf("%d",&c); //读入每个月花的钱
s-=c-300; //等效于s=s+300-c,算出这个月过去之后还剩多少钱
if(s<0) //如果(“哇这个月过去之后我就没钱了!”)
{
printf("-%d",i); //直接输出“-月份”
return 0; //然后结束程序(没钱啦不活啦!//并不需要读完所有数据)
}
else h+=s/100,s%=100; //如果这个月过去之后还有钱,我们就把整百的钱(s/100)存给麻麻,并给自己留下零钱(s%100)
}
printf("%d",120*h+s); //成功抵达12月,每张100元将会变成120元,加上自己手里的零钱,输出
return 0;
}
欢迎指正与分享,谢谢!