真题链接:https://www.lanqiao.cn/problems/597/learning/
题目描述:
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑1干米。如果某天是周一或者月初(1
日),为了激励自己,小蓝要跑2干米。如果同时是周一或月
初,小蓝也是跑2干米。
小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)
到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多
少干米?
前置讲解
- 一般解题思路:一般解题思路是去算2000-2020里哪些是平年、闰年,它们二月对应的天数是不同的,导致一年中具体的哪一天的星期是会变化的。
- 运用特殊数据结构解题 更优:一般解题思路下的代码逻辑非常繁琐,很复杂,搞不好就run不出来。我们使用的是python,在python里其实是有方便处理日期的数据结构的,是datatime类。我们直接从2000年1月1日-2020年10月1日遍历,一般累加1km、特殊加2km就好了。至于当前是星期几、是平年闰年都不归我们考虑。
算法逻辑
# 大体思路:从2000-2020年遍历,维护累计路程变量。按照如果当天周一、月初就累2km,其他累加1km的方式
# 去更新路程变量创建锻炼start日期
创建锻炼end日期
创建ans存储答案# 循环效果:从start到end遍历日子,根据规则统计期间所累计的路程总数到ans
for 还有日子没统计就做if 如果是星期一或者月初start更接近end一天ans累加当天的2kmelsestart更接近end一天ans累加当天的1km打印答案ans
语言代码
import datetime
# 大体思路:从2000-2020年遍历,维护累计路程变量。按照如果当天周一、月初就累2km,其他累加1km的方式
# 去更新路程变量# 创建锻炼start日期
start = datetime.date(2000, 1, 1)
# 创建锻炼end日期
end = datetime.date(2020, 10, 1)days = datetime.timedelta(days=1) # 发现要创建一个表示1天的常量用来辅助更新# 创建ans存储答案
ans = 0# 循环效果:从start到end遍历日子,根据规则统计期间所累计的路程总数到ans
while(start <= end): # 还有日子没统计就做# 如果是星期一或者月初if start.day == 1 or start.isoweekday() == 1:# start更接近end一天start += days# ans累加当天的2kmans += 2else:# start更接近end一天start += days# ans累加当天的1kmans += 1
# 打印答案ans
print(ans)
补充:大家也许不了解datatime模块和里面的方法,这里附上官方文档介绍:https://docs.python.org/zh-cn/3/library/datetime.html#module-datetime。看看、理解理解自己也能写出来