第十一届蓝桥杯省赛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