算法竞赛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

 

相关文章
|
14天前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
171 35
|
21天前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
25天前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
1月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
3月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
109 0
|
4月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
60 4
|
4月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
136 0
|
4月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
142 1
|
5月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
392 58
|
6月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
254 0

热门文章

最新文章