算法竞赛100天第1天 —— 第十一届蓝桥杯省赛C/C++ B组 —— 跑步锻炼(不看会后悔的《日期年份问题三种解法 — C++和Java代码以及Excel解法》)

简介: 算法竞赛100天第1天 —— 第十一届蓝桥杯省赛C/C++ B组 —— 跑步锻炼(不看会后悔的《日期年份问题三种解法 — C++和Java代码以及Excel解法》)

第十一届蓝桥杯省赛C/C++ B组 —— 跑步锻炼

题目大意

小蓝每天都锻炼身体。


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


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

解题思路

简单模拟题。

主要需要解决两个问题:

  • 是否是月初
  • 是否是周一

我们可以枚举从 2000 年 1 月 1 日到 2020 年 10 月 1 日的所有日期:用 y、m、d 分表表示当前枚举的年、月、日,那么当 d=1 为月初,否则不为月初。问题一解决。


同时我们可以定义 week 表示当前日期所对应的星期,这样下一个日期所对应的星期就为 (week+1)。那么当 week=1 时为周一,否则不为周一。问题二解决。


最后模拟一下即可(注意判断闰年),答案为 8879。

C++

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int days[] = {
    0, 31, 28, 31, 30, 31, 30,
    31, 31, 30, 31, 30, 31
};
bool is_leap(int y){
    return y % 100 != 0 && y % 4 == 0 || y % 400 == 0;
}
int daysOfMonth(int y, int m){
    if (m == 2)
        return 28 + is_leap(y);
    return days[m];
}
int main()
{
    int y = 2000, m = 1, d = 1, w = 6;
    int res = 0;
    while (y != 2020 || m != 10 || d != 2){
        if (d == 1 || w == 1)
            res += 2;
        else
            res ++;
        w ++;
        if (w == 8)
            w = 1;
        d ++;
        if (d > daysOfMonth(y, m)){
            m ++, d = 1;
            if (m == 13)
                m = 1, y ++;
        }
    }
    cout << res << endl;
    return 0;
}

Java

import java.util.*;
public class Main {
    static int year = 2000, month = 1, day = 1, week = 6;//年,月,日,周几
    public static void main(String args[]) {
        int res = 0;
        while(true)
        {
          if(year == 2020 && month == 10 && day == 2) break;
          //检查是否为月初或者周一(true:2,false:1)
          if(check()) res += 2;
          else res ++ ;
          update();
        }
        System.out.println(res);
    }
    //检查是否是月初或者周一
    static boolean check()
    {
        if(day == 1 || week  == 1) return true;
        return false;
    }
    //迭代函数
    static void update()
    {
        day ++ ;
        week ++ ;
        week = (week%8) != 0 ? week % 8 : 1;//week更新
        int m = 31;
        if(month == 2)
        {
          if(year % 4 == 0 || year % 400 == 0) m = 29; //世纪闰年和普通闰年都要加进去
          else m = 28;
        }
        else if(month == 4 || month == 6 || month == 9 || month == 11) m = 30;
        if(day / (m + 1) != 0)//day已更新
        {
          month ++ ;
          day = 1;
        }
        if(month / 13 != 0)//month已更新
        {
            year ++ ;
            month = 1;
        }
    }
}

Excel解法

首先在日期列输入起始日期2000/1/1(注意格式)

然后摁住该格右下角往下拉,日期会自动填充,一直填充到截至日期,即2020/10/1

接下来判断是否为月初(公式--->逻辑--->if)

下拉自动填充

接着判断该天是否为周一。

点击判断下第一个(2000/1/1对应格),和前面一样,选择IF函数。

在判断里输入WEEKDAY(A7554)=2,第一个返回值输入1,第二个返回值输入0。

填充即可

接着处理综合判断,用来判断该天是否为月初(一日)或周一。

点击判断下第一格(2000/1/1对应行),选择公式,选择逻辑,再选择OR。

在第一个判断里输入B2=1(判断是否为月初),在第二个判断里输入C2=1(判断是否为周一)。

下拉填充

最后,来处理每天的跑步数。

点击跑步数下第一格(2000/1/1对应行),选择公式,选择逻辑,再选择IF函数,再判断里输入D2=TRUE,第一个返回值输入2,第二个返回值输入1。(即True = 2,False = 1)

最后下拉填充自动求和即可得到答案8879

 

相关文章
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
99 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
132 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
3月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
740 0
高精度算法(加、减、乘、除,使用c++实现)
|
3月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
97 2
|
3月前
|
应用服务中间件 nginx Docker
vue3读取配置文件变量+证书certbot+Excel身份证提取出生日期+crontab定时任务
vue3读取配置文件变量+证书certbot+Excel身份证提取出生日期+crontab定时任务
45 2
|
3月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
3月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
3月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
3月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)