打鱼与晒网

October 8, 2019
Algorithm Python

这算是什么?由于这样那样的原因,应该算是新坑,python 写算法?

Tag:Algorithm 系列,不保证是最优解,(甚至不一定能做出来??)

尽量不鸽吧。

题目

路人甲从 1990 年第一天开始三天打鱼两天晒网。随便给一个年月日,输出此人状态

输入 :4%d-2%d-2%d (e.g. 2014-12-22)

思路

算出来一共过了多少天,得除以 5 的余数对号入座就行了。

主要可能算闰年会耗费点时间。

代码

# 每月多少天,闰年的 2 月就直接 +1 解决;list 中,舍弃第一个元素 [0]
dayByMonth = [0,31,28,31,30,31,30,31,31,30,31,30,31]

# 累积的天数,闰年的情况 2 月往后每月 +1,同舍弃第一个
dayCountByMonth = [0,31,59,90,120,151,181,212,243,273,304,334]
# 对号入座,[0]表示除尽,即第五天
statu = [False,True,True,True,False]

# 判定输入是否合法
def isValid():
    # 不接受小于 1990 的年份
    if year < 1990:
        return False
    # 月份不能大于 12
    if month > 12:
        return False
    # 若不是闰年
    if not spec:
        # 该月天数大于既定
        if day > dayByMonth[month]:
            return False
    # 若是闰年
    if spec:
        # 2月
        if month == 2 and day > 29:
            return False
        # 非2月
        if month != 2 and day > dayByMonth[month]:
            return False
    return True

# 输入,以 “-” 进行分割
query = input()
asd = [int(x) for x in query.split('-')]
year = asd[0]
month = asd[1]
day = asd[2]

# 判断是否闰年,因为不知道判定样例,所以这里本来是直接取与 4 的余数的
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0  :
    spec = True
else:
     spec = False
# 不合法就直接退了
if not isValid():
    print("Invalid input")
    exit(0)

# 一共过了多少年
passedYear = year - 1990
# 这其中有多少闰年
if year >= 1992:
    passedSpecYear = (year - 1992)/4 +1
else:
    passedSpecYear = 0

# 计算总共的天数
# 如果不是闰年,或闰年的1月
if (not spec) or (spec and month == 1):
    totalDayCount = 365*passedYear + passedSpecYear + day + dayCountByMonth[month-1]
else:
    # 闰年的2月及以上,list 的数据需要 +1
    totalDayCount = 365*passedYear + passedSpecYear + day + dayCountByMonth[month-1]+1

# 求一个余数,不太清楚为什么这里搞出来的默认是浮点型,还得转换一次
reset = int(totalDayCount % 5)

# 直接对号入座
if statu[reset]:
    print("He is working")
else:
    print("He is having a rest")

由于提交当时没能全过,我也不知道这个能不能过全部的数据。

总之样例是没问题的。

comments powered by Disqus.
Can't load? Check your connectivity and try again.