蓝桥杯:跑步锻炼算法题(java)

该文章仅供参考,因为博主很菜,所以方法很笨,望大佬们提出宝贵的意见!!!谢谢!!!

原题目

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。

小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

运行限制

最大运行时间:1s
最大运行内存: 128M

思路解析

在本文中,该算法题的结果可以分为三部分:

  • 第一部分:小蓝每天跑1公里的总里程(相当于总天数)
  • 第二部分:小蓝每个月初多跑1公里的总里程
  • 第三部分:小蓝每周一多跑1公里的总里程(不包括月初)
    所以,在该题中额外需要注意的点就是:
    当一天既是月初又为周一时,不能将该天多跑的里程加两次!!!

对应于思路,我们需要求解的变量就有了:

  • 需要找到从2000年1月1日到2020年10月1日每个月的月初;
  • 需要找到从2000年1月1日到2020年10月1日每周的周一;
  • 要有这20年的总天数;
  • 需要找到既是月初又是周一的天数;

原答案(不建议观看)

虽然写的很烂,但还是厚着脸皮放出来吧。。。
没有经过整理的原答案,没有函数,很臃肿,但确实是写对了,
可能会对读者有点启发:

import java.util.Scanner;
import java.util.ArrayList;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...//该list集合用于存储每个月的月初ArrayList<Integer> list = new ArrayList<>();int sum = 1;        //记录总天数,初始值为1表示2000年1月1日已经计算在内int ans = 1;      //总里程,1表示2000年1月1日已经多跑了1公里(月初)//第一部分:每个月初多跑一公里for(int i = 2000; i <= 2020;i++){//根据每个月天数相加sum += 31;ans++;       //多跑了一公里list.add(sum);//这里简略判断了闰年,当年数变化以后可能不好使if(i % 4 == 0){sum += 29;}else{sum += 28;}list.add(sum);ans++;sum += 31;list.add(sum);ans++;sum += 30;list.add(sum);ans++;sum += 31;list.add(sum);ans++;sum += 30;list.add(sum);ans++;sum += 31;list.add(sum);ans++;sum += 31;list.add(sum);ans++;sum += 30;list.add(sum);ans++;//截止到2020年10月1日if(i != 2020){sum += 31;list.add(sum);ans++;sum += 30;list.add(sum);ans++;sum += 31;list.add(sum);ans++;}}//第二部分:每天跑1公里的总里程ans += sum;//第三部分:每周一多跑1公里,并剔除掉月初,防止重复计算。for(int i = 3;i < sum;i += 7){if(list.contains(i)){continue;}ans++;}//输出结果System.out.println(ans);scan.close();}
}

由于原答案比较烂,所以注释就不写那么详细了,大家可以看整理后的答案。

经过整理后的答案

  • 将12个月的天数使用一个数组进行封装;
  • 将判断闰年单独写一个函数;
  • ArrayList集合用于存储每个月的月初;
  • num表示总天数,初始值为1表示2000年1月1日已经计算在内;
  • ans表示总里程,初始值为1表示2000年1月1日月初已经多跑了1公里;
  • ans++表示月初或周一多跑了一公里。
import java.util.ArrayList;public class Main{public static void main(String[] args){//初始化月份天数,二月份天数会进行额外处理int[] monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//新建一个集合,该集合中用于存储所有月初天数ArrayList<Integer> list = new ArrayList<>();int num = 1;    //表示从2000年1月1日到2020年10月1日经历的总天数,初始值为1表示2000年1月1日已经被计算在内。int ans = 1;    //表示总里程,即答案的结果。初始值为1表示2000年1月1日多跑1千米。for(int i = 2000;i <= 2020;i++) {monthDays[1] = 28;//判断该年是否为闰年,若为闰年2月份为29天if(isLeapYear(i)){monthDays[1] = 29;}for(int j = 0;j < monthDays.length;j++){//若已经到了2020年10月1日,退出循环if(i == 2020 && j == 9) break;num += monthDays[j];      //总天数list.add(num);     //将月初加入集合中//若为月初,总里程多跑1千米;ans++;}}/*循环结束后,分析一下变量的值:list:list中包含了所有从2000年1月1日到2020年10月1日中的月初所经历的天数。num:num的值为2020年1月1日(含)到2020年10月1日(含)的总天数。ans:所有月初多跑的里程已经计算在内。*/ans += num;       //每天跑1千米/*** 计算每周一多跑的1千米,并且若为月初,不需要重复计算。*///因为第1天为周六,所以周一从第3天开始。for(int i = 3;i < num;i += 7){//若为月初,直接跳过,不要重复计算。if(list.contains(i)){continue;}ans++;}//输出结果System.out.println(ans);}/*** 判断该年是否为闰年*/public static boolean isLeapYear(int year){return (year % 400 == 0 || year % 4 == 0 && year % 100 != 0);}}

运行结果

感谢大家艰难的看完了我的思路!
欢迎大家提出意见!

蓝桥杯:跑步锻炼(java代码)相关推荐

  1. 2020蓝桥杯跑步锻炼

    跑步锻炼 题目描述 小蓝每天都锻炼身体.正常情况下,小蓝每天跑1千米.如果某天是周一或者月初(1日),为了激励自 己,小蓝要跑2千米.如果同时是周一或月初,小蓝也是跑2千米.小蓝跑步已经坚持了很长时间 ...

  2. 蓝桥杯跑步锻炼.c语言

    小蓝每天都锻炼身体. 正常情况下,小蓝每天跑 1 千米.如果某天是周一或者月初(1日),为了激励自己,小蓝要跑 2 千米.如果同时是周一或月初,小蓝也是跑 2 千米. 小蓝跑步已经坚持了很长时间,从  ...

  3. 蓝桥杯 审美课java 代码讲解

    问题描述<审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师请同学们分辨哪些画的作者是梵高,但是老师自己并没有答案,因为这些画看上去都像 ...

  4. 蓝桥杯-Sine之舞-java

    蓝桥杯-Sine之舞-java 题目 问题描述最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的 ...

  5. 蓝桥杯 拿金币 java实现

    蓝桥杯 拿金币 java实现(通俗易懂) 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币.你站在最左 ...

  6. 蓝桥杯软件类Java语言IDE(Eclipse)安装

    蓝桥杯软件类Java语言IDE(Eclipse)安装以及个性化设置 平时都在用idea搞工程类项目,正好报了下学期的蓝桥杯算法比赛,看到官网要求用eclipse编码,之前也参加过ccf-csp的比赛, ...

  7. 2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛)

    2021第十二届蓝桥杯省赛JAVA B组 题目+答案(复现赛) A:ASC B:卡片 C:直线 D:货物摆放 E:路径 Floyed Dijkstra F:时间显示 G:最少砝码 H:杨辉三角形 I: ...

  8. 蓝桥杯-最大最小公倍数java语言

    蓝桥杯-最大最小公倍数java语言 开局一句话: 做这道题的时候,便没有对最小公倍数十分了解,就直接写了,也是惭愧,走了太多弯路,后来才知道,最小公倍数不是单单的几个数相乘就完了. 问题描述: 已知一 ...

  9. 2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数

    2020年第十一届蓝桥杯 - 国赛 - Java研究生组 - F.循环小数 在线评测 Ideas 对于一个纯循环小数,假设循环节为l,则小数为0.llll-,转换为分数就是 l / (10 ** n ...

  10. 2013蓝桥杯java试题_蓝桥杯2013决赛java本科b组试题.doc

    蓝桥杯2013决赛java本科b组试题.doc 试题一:公式求值问题描述输入n,m,k,输出下面公式的值.其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如 ...

最新文章

  1. 程序员敲代码时,戴着耳机究竟在听什么?
  2. mapreduce.job.reduce.slowstart.completedmaps
  3. 你还是只会用数组吗?不懂Java集合,还想找工作?(集合概述)
  4. 中国首次实现量子优越性!比谷歌突破更厉害,比最强超级计算机快一百万亿倍 | Science...
  5. python2基本数据类型
  6. UA MATH ECE636 信息论10 Non-adaptive Group Testing
  7. [转]python yield
  8. java applet 输出多行_java学习笔记-输入输出、Applet和多线程开发
  9. QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置
  10. React:网络工具库
  11. 《深入浅出统计学》 第三章 分散性与变异性的量度 距
  12. 【毕业设计】2021年计算机专业-12套精品项目源码免费下载
  13. 21年最新-李沐-动手学深度学习第二版
  14. android 沙盒双开 微信,微信双开回来了,还不会被封号
  15. linux edt时间转成cst时间,edt时间和北京时间换算(edt时间 现在)
  16. Java是什么?怎么学Java?
  17. 图像识别开源_看看开源图像识别技术
  18. MySQL字符串规则提取
  19. 一位友人做足这些准备,终于拿到了FaceBook的offer
  20. 工作流(workflow)参考规范概述

热门文章

  1. Spring中PROPAGATION_REQUIRED是什么意思?
  2. 高并发系统设计——分布式锁解决方案
  3. 查找(顺序查找,折半查找,分块查找)
  4. lodop指定打印机打印_前端使用lodop插件进行打印设置
  5. curl模拟form表单提交
  6. oracle biee catalog,BIEE 目录迁移(文件夹)方式
  7. Golang的range
  8. 高数 | 【无穷级数】基础阶段总结 注意点、例题
  9. C# 委托与事件详解(二)
  10. Java Comparator.comparing比较导致空指针异常