这个题目当年困扰了我许久,现在来反思一下

本文为博客园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. 1. 月初,妈妈给JJ
  2. 2. 津津判断钱够不够花
  3. 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\)

  1. // 来源:洛谷题解
  2. // 作者:yangshizhuang
  3. #include <stdio.h>
  4. int main()
  5. {
  6. int n;
  7. int sum = 0; //初始化,用于记录每个月剩余有多少钱
  8. int sum0 = 0; //如果中间没有出现缺钱的情况,那么就用这个sum0来存储每个月在妈妈手里有多少钞票
  9. for (int i = 1; i <= 12; i++) //一年十二个月,不多做解释了
  10. {
  11. sum += 300; //妈妈给钱
  12. scanf("%d", &n);
  13. sum = sum - n;
  14. if (sum < 0) //如果消费大于开支则为负数,直接输出ok
  15. {
  16. printf("-%d\n", i); //特别注意负号
  17. return 0;
  18. }
  19. else
  20. sum0 += sum / 100 * 100; //如果不是就往妈妈手里存钱
  21. sum = sum - sum / 100 * 100; //每个孩子手里剩余多少钱
  22. }
  23. printf("%d\n", sum0 * 12 / 10 + sum); //如果上述未有输出,那么就可以打印输出多少钱了
  24. return 0;
  25. }

\(C++\)

  1. // 来源:自己写的
  2. // 作者:@ShyButHandsome
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. int main(void)
  6. {
  7. int mother = 0;
  8. int rest = 0;
  9. const int ADD = 300;
  10. int cost = 0;
  11. for (int month = 0; month < 12; month++)
  12. {
  13. cin >> cost;
  14. rest += ADD;
  15. if (rest < cost)
  16. {
  17. cout << "-" << month + 1;
  18. // 直接结束程序运行
  19. return 0;
  20. }
  21. rest -= cost;
  22. if (rest > 100)
  23. {
  24. // 隐式类型转换
  25. mother += rest / 100 * 100;
  26. rest -= rest / 100 * 100;
  27. }
  28. }
  29. // 要加上手里还剩下的钱(+rest)
  30. double money = mother * 1.2 + rest;
  31. cout << money;
  32. return 0;
  33. }

\(Java\)

  1. // 来源:洛谷题解
  2. // 作者:@TiMan
  3. import java.util.Scanner;
  4. public class Main {
  5. public static void main(String args[]) {
  6. int b, i, c = 0;
  7. int sum = 300;
  8. int x = 0;
  9. int m = 0;
  10. double ssum = 0;
  11. Scanner input = new Scanner(System.in);
  12. for (i = 1; i <= 12; i++) {
  13. int a = input.nextInt();
  14. if (sum < a && x == 0) {
  15. x = i;
  16. } else {
  17. b = sum - a;
  18. if (b >= 100) {
  19. c = b % 100;
  20. m = m + b / 100; // m=1,
  21. sum = c + 300;
  22. ssum = c + m * 100 + m * 100 * 0.2;
  23. } else {
  24. sum = b + 300;
  25. ssum = b + m * 100 + m * 100 * 0.2;
  26. }
  27. }
  28. }
  29. if (x != 0) {
  30. System.out.println("-" + x);
  31. } else {
  32. System.out.println((int) ssum);
  33. }
  34. }
  35. }

\(Pascal\)

  1. // 来源:洛谷题解
  2. // 作者:@川芎
  3. var
  4. y,s,x,i,g:longint;
  5. begin
  6. s:=0;
  7. g:=0;
  8. i:=1;
  9. while i<> 13 do
  10. begin
  11. readln(y);
  12. if y>300+s then //如果钱不够了
  13. begin
  14. write('-',i); //输出预算大于资金的月份
  15. break;
  16. end
  17. else
  18. g:=g+(((300+s-y) div 100)*100);//如预算小于资金,把钱给妈妈
  19. s:=(300+s-y) mod 100;//这是自己剩下的钱
  20. if (y<300+s) and (i=12) then
  21. write(g*1.2+s:0:0);//最后加起来
  22. i:=i+1;
  23. end;
  24. end.

\(Python3\)

  1. # 来源:自己写的
  2. # 作者:@ShyButHandsome
  3. mother = 0
  4. rest = 0
  5. for month in range(1, 13):
  6. cost = int(input())
  7. rest += 300
  8. if rest < cost:
  9. print(-month)
  10. exit()
  11. rest -= cost
  12. if rest > 100:
  13. # '//' 是整除而非注释
  14. mother += rest // 100 * 100
  15. rest -= rest // 100 * 100
  16. money = mother * 1.2 + rest
  17. print(money)

总结

其实现在来看,这个题目特别简单

但当时就是一直不能\(AC\)

困扰了我好久

总结下这里踩过的几个坑

年代久远,人老记忆力也不好了,可能总结的不是很全面

欢迎补充你在做这个题目时

遇到的问题\(\&\)解决方案

  1. 不会做,没思路

    这题虽然是\(NOIp\)提高组,但实际上很简单

    如果你在做这题时感觉没有思路

    或者算法很复杂

    那么你可以多做做同类型(循环、模拟)的题目

    这类题目几乎都会对一个循环外的变量进行累加、累乘等

    比如这里的mother += rest / 100 * 100
  2. 代码看上去很好,但结果和答案总有那么点偏差

    这种情况可能是你赋予了了一些变量不属于他们类型的使命

    比如:整型除法(除数与被除数都是整型)结果也会是一个整型,而你想要小数

    计数器比预期的值少\(1\)。
  3. 代码看上去很好,但结果和答案大相径庭

    这种情况可能是你的代码逻辑上出现了问题

    比如:

    ><写反了;

    少了某条语句;

    for循环是从0开始计数,而你使用时没有+1

    数组越界,等等;

你问我为什么这么清楚?

都是泪啊~

参考资料

洛谷P1089题解

我是ShyButHandsome,一个名字与实际截然相反的OI蒟蒻,如果你觉得这篇文章写的还行的话,不妨点点推荐?

津津的储蓄计划 NOIp提高组2004的更多相关文章

  1. NOIP提高组2004 合并果子题解

    NOIP提高组2004 合并果子题解 描述:在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消 ...

  2. 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划

    1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...

  3. [TYVJ] P1065 津津的储蓄计划

    津津的储蓄计划 背景 Background NOIP2004 提高组 第一道   描述 Description     津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月 ...

  4. $NOIp$提高组历年题目复习

    写在前面 一个简略的\(NOIp\)题高组历年题目复习记录.大部分都有单独写题解,但懒得放\(link\)了\(QwQ\).对于想的时候兜了圈子的题打上\(*\). \(NOIp2018\ [4/6] ...

  5. NOIP2004 津津的储蓄计划

    一.津津的储蓄计划 (Save.pas/dpr/c/cpp). [问题描述] 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. ...

  6. NOIP提高组历年真题题解

    2018 铺设道路 差分水题,推一下结论就好了. #include<cstdio> #include<algorithm> using namespace std; ],d[] ...

  7. $NOIp$提高组做题记录

    对了我在这里必须讲一个非常重要的事情,就是前天也就是$2019.8.21$的傍晚,我决定重新做人了$!!$ 其实之前没怎么做$Noip$题,那就从现在开始叭

  8. P1089_津津的储蓄计划(JAVA语言)

    package 顺序与分支; /* * 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱, 津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄, ...

  9. [枚举]P1089 津津的储蓄计划

    津津的储蓄计划 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整 ...

随机推荐

  1. Java基础 - 原码、反码、补码

    目录 机器数 真值 原码 反码 补码 为什么使用原码. 反码. 补码 机器数 所有数字在计算机底层都是以二进制形式存在的.它的表现形式叫做机器数,这个数有正负之分,最高位为符号位.0 表示正数, 1 ...

  2. 在eclipse里面给maven项目打包

    eclipse中的“maven install”是用maven打包工程的意思. mvn install 是将用户打包好的jar包安装到本地仓库中,一般没有设置过的话默认在用户目录下的 .m2\下面. ...

  3. MySQL 教程--检视阅读

    MySQL 教程--检视阅读 准备:Windows 上安装 MySQL 教程地址,PHP语言基础 教程地址2 教程地址3,有讲数据库的备份和恢复 教程地址4,w3c.china,php基础,扩展阅读 ...

  4. 面试刷题21:java并发工具中的队列有哪些?

    ![image.png](https://img2020.cnblogs.com/other/268922/202003/268922-20200330183801141-1514127119.png ...

  5. 二维线段树 poj-2155

    题意:t组样例 ,输入 n,m,表示n*n的矩阵进行m次操作 ,C: 输入两个坐标 ,组成的矩形 进行取反操作 ,Q:对输的坐标位置输入其值. 思路:一开始想的是用1000(表示x轴)个线段树(对每段 ...

  6. UVA - 548 根据中序遍历和后序遍历建二叉树(关于三种遍历二叉树)

    题意: 同时给两个序列,分别是二叉树的中序遍历和后序遍历,求出根节点到叶子结点路径上的权值最小和 的那个 叶子节点的值,若有多个最小权值,则输出最小叶子结点的和. 想法: 一开始想着建树,但是没有这样 ...

  7. CVE-2020-2551复现过程

    项目地址 cnsimo/CVE-2020-2551 CVE-2020-2551 weblogic iiop 反序列化漏洞 该项目的搭建脚本在10.3.6版本经过测试,12版本未测试. 环境 kali+ ...

  8. 【Redis】集群教程(Windows)

    概述 Redis集群数据分片 Redis集群节点通讯 环境准备 搭建Redis集群 测试Redis集群 概述 Redis Cluster provides a way to run a Redis i ...

  9. Appium:We shut down because no new commands came in

    在使用Appium自带的Inspector来查找元素定位时,一段时间(60s)不对其进行任何操作appium就会关闭Android应用,并打印出 info: [debug] We shut down ...

  10. 根据银行卡号 获取银行名称及银行logo

    根据银行卡号码获取银行卡归属地信息接口地址: https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8 ...