津津的储蓄计划 NOIp提高组2004
这个题目当年困扰了我许久,现在来反思一下
本文为博客园ShyButHandsome的原创作品,转载请注明出处
右边有目录,方便快速浏览
题目描述
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津\(300\)元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上\(20\%\)还给津津。
因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于\(100\)元或恰好\(100\)元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如\(11\)月初津津手中还有\(83\)元,妈妈给了津津\(300\)元。津津预计\(11\)月的花销是\(180\)元,那么她就会在妈妈那里存\(200\)元,自己留下\(183\)元。
到了\(11\)月月末,津津手中会剩下\(3\)元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。
有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据\(2004\)年\(1\)月到\(12\)月每个月津津的预算,判断会不会出现这种情况。
如果不会,计算到\(2004\)年年末,妈妈将津津平常存的钱加上\(20\%\)还给津津之后,津津手中会有多少钱。
输入格式
\(12\)行数据,每行包含一个小于\(350\)的非负整数,分别表示\(11\)月到\(12\)月津津的预算。
输出格式
一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出\(-X\),\(X\)表示出现这种情况的第一个月;
否则输出到\(2004\)年年末津津手中会有多少钱。
分析
仔细阅读题目后,我的第一思路是模拟
整体思路流程如下:
1. 月初,妈妈给JJ钱
2. 津津判断钱够不够花
3. 月末,JJ的钱减去本月花了的钱(和给妈妈的钱,如果有的话)
以下下分别是关键语句对应的伪代码
伪代码:一种让人关注于算法本身而非实现的描述语言,没有固定语法,但要做到易懂
- \(12\)个月:
for month from 1 to 12 - 每月月初,妈妈给津津\(300\)块钱:
rest money add 300 - 判断钱够不够花
if rest_money - cost > 100 - 给妈妈钱
mother_money add (rest_money - rest_money mod 100) - 月末,结算
rest = rest - the money was gived mother - cost
代码实现
\(C\)
// 来源:洛谷题解
// 作者:yangshizhuang
#include <stdio.h>
int main()
{
int n;
int sum = 0; //初始化,用于记录每个月剩余有多少钱
int sum0 = 0; //如果中间没有出现缺钱的情况,那么就用这个sum0来存储每个月在妈妈手里有多少钞票
for (int i = 1; i <= 12; i++) //一年十二个月,不多做解释了
{
sum += 300; //妈妈给钱
scanf("%d", &n);
sum = sum - n;
if (sum < 0) //如果消费大于开支则为负数,直接输出ok
{
printf("-%d\n", i); //特别注意负号
return 0;
}
else
sum0 += sum / 100 * 100; //如果不是就往妈妈手里存钱
sum = sum - sum / 100 * 100; //每个孩子手里剩余多少钱
}
printf("%d\n", sum0 * 12 / 10 + sum); //如果上述未有输出,那么就可以打印输出多少钱了
return 0;
}
\(C++\)
// 来源:自己写的
// 作者:@ShyButHandsome
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int mother = 0;
int rest = 0;
const int ADD = 300;
int cost = 0;
for (int month = 0; month < 12; month++)
{
cin >> cost;
rest += ADD;
if (rest < cost)
{
cout << "-" << month + 1;
// 直接结束程序运行
return 0;
}
rest -= cost;
if (rest > 100)
{
// 隐式类型转换
mother += rest / 100 * 100;
rest -= rest / 100 * 100;
}
}
// 要加上手里还剩下的钱(+rest)
double money = mother * 1.2 + rest;
cout << money;
return 0;
}
\(Java\)
// 来源:洛谷题解
// 作者:@TiMan
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
int b, i, c = 0;
int sum = 300;
int x = 0;
int m = 0;
double ssum = 0;
Scanner input = new Scanner(System.in);
for (i = 1; i <= 12; i++) {
int a = input.nextInt();
if (sum < a && x == 0) {
x = i;
} else {
b = sum - a;
if (b >= 100) {
c = b % 100;
m = m + b / 100; // m=1,
sum = c + 300;
ssum = c + m * 100 + m * 100 * 0.2;
} else {
sum = b + 300;
ssum = b + m * 100 + m * 100 * 0.2;
}
}
}
if (x != 0) {
System.out.println("-" + x);
} else {
System.out.println((int) ssum);
}
}
}
\(Pascal\)
// 来源:洛谷题解
// 作者:@川芎
var
y,s,x,i,g:longint;
begin
s:=0;
g:=0;
i:=1;
while i<> 13 do
begin
readln(y);
if y>300+s then //如果钱不够了
begin
write('-',i); //输出预算大于资金的月份
break;
end
else
g:=g+(((300+s-y) div 100)*100);//如预算小于资金,把钱给妈妈
s:=(300+s-y) mod 100;//这是自己剩下的钱
if (y<300+s) and (i=12) then
write(g*1.2+s:0:0);//最后加起来
i:=i+1;
end;
end.
\(Python3\)
# 来源:自己写的
# 作者:@ShyButHandsome
mother = 0
rest = 0
for month in range(1, 13):
cost = int(input())
rest += 300
if rest < cost:
print(-month)
exit()
rest -= cost
if rest > 100:
# '//' 是整除而非注释
mother += rest // 100 * 100
rest -= rest // 100 * 100
money = mother * 1.2 + rest
print(money)
总结
其实现在来看,这个题目特别简单
但当时就是一直不能\(AC\)
困扰了我好久
总结下这里踩过的几个坑
年代久远,人老记忆力也不好了,可能总结的不是很全面
欢迎补充你在做这个题目时
遇到的问题\(\&\)解决方案
- 不会做,没思路
这题虽然是\(NOIp\)提高组,但实际上很简单
如果你在做这题时感觉没有思路
或者算法很复杂
那么你可以多做做同类型(循环、模拟)的题目
这类题目几乎都会对一个循环外的变量进行累加、累乘等
比如这里的mother += rest / 100 * 100。 - 代码看上去很好,但结果和答案总有那么点偏差
这种情况可能是你赋予了了一些变量不属于他们类型的使命
比如:整型除法(除数与被除数都是整型)结果也会是一个整型,而你想要小数
计数器比预期的值少\(1\)。 - 代码看上去很好,但结果和答案大相径庭
这种情况可能是你的代码逻辑上出现了问题
比如:
>和<写反了;
少了某条语句;
for循环是从0开始计数,而你使用时没有+1;
数组越界,等等;
你问我为什么这么清楚?
都是泪啊~
参考资料
我是ShyButHandsome,一个名字与实际截然相反的OI蒟蒻,如果你觉得这篇文章写的还行的话,不妨点点推荐?
津津的储蓄计划 NOIp提高组2004的更多相关文章
- NOIP提高组2004 合并果子题解
NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...
- 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划
1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...
- [TYVJ] P1065 津津的储蓄计划
津津的储蓄计划 背景 Background NOIP2004 提高组 第一道 描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月 ...
- $NOIp$提高组历年题目复习
写在前面 一个简略的\(NOIp\)题高组历年题目复习记录.大部分都有单独写题解,但懒得放\(link\)了\(QwQ\).对于想的时候兜了圈子的题打上\(*\). \(NOIp2018\ [4/6] ...
- NOIP2004 津津的储蓄计划
一.津津的储蓄计划 (Save.pas/dpr/c/cpp). [问题描述] 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. ...
- NOIP提高组历年真题题解
2018 铺设道路 差分水题,推一下结论就好了. #include<cstdio> #include<algorithm> using namespace std; ],d[] ...
- $NOIp$提高组做题记录
对了我在这里必须讲一个非常重要的事情,就是前天也就是$2019.8.21$的傍晚,我决定重新做人了$!!$ 其实之前没怎么做$Noip$题,那就从现在开始叭
- P1089_津津的储蓄计划(JAVA语言)
package 顺序与分支; /* * 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱, 津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄, ...
- [枚举]P1089 津津的储蓄计划
津津的储蓄计划 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整 ...
随机推荐
- MySQL对JSON类型UTF-8编码导致中文乱码探讨
前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...
- 解决python3使用cx_Freeze打包成exe后不能运行
我使用的是python3.4,在使用cx_Freeze打包成exe后发现有些打包后程序能够运行,但是有些无法运行 这是控制台报错 经过多方查找发现原来是windows缺少一些python的扩展包 如下 ...
- 使用PyTorch建立你的第一个文本分类模型
概述 学习如何使用PyTorch执行文本分类 理解解决文本分类时所涉及的要点 学习使用包填充(Pack Padding)特性 介绍 我总是使用最先进的架构来在一些比赛提交模型结果.得益于PyTorch ...
- 一文上手TensorFlow2.0(一)
目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU) Te ...
- Github标星过万,Python新手100天学习计划,这次再学不会算我输!
作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条. 当然,学Python这件事情,你可能也和文摘菌一样,已经下了一百次 ...
- coding++:高并发解决方案限流技术--计数器--demo
1.它是限流算法中最简单最容易的一种算法 计数器实现限流 每分钟只允许10个请求 第一个请求进去的时间为startTime,在startTime + 60s内只允许10个请求 当60s内超过十个请求后 ...
- 怎么在三层架构中使用Quartz.Net开源项目(与数据库交互)
1.首先在项目中先创建一个控制台应用程序 2.然后右击项目中的[引用],可以[添加引用],也可以[管理NuGet程序包],作者使用的是[添加引用],添加本地应用.版本不同,所使用的方式不同.需要此版本 ...
- [noip2016]组合数问题<dp+杨辉三角>
题目链接:https://vijos.org/p/2006 当时在考场上只想到了暴力的做法,现在自己看了以后还是没思路,最后看大佬说的杨辉三角才懂这题... 我自己总结了一下,我不能反应出杨辉三角的递 ...
- js生成一个指定范围内的随机整数
function __random(start=0, end=1) { return Math.floor(Math.random() * (end - start + 1) + start); } ...
- Python 参数使用总结
Python 中参数的传递非常灵活,不太容易记住理解,特整理如下备忘: 普通参数 即按照函数所需的参数,对应位置传递对应的值,可以对应 Java 中的普通参数 def max(a, b): if a ...