Python-CCF:20180902 买菜

题目描述

在这里插入图片描述

用时

1h,略长,主要是考虑分类讨论的边界点耗时间

思路

两人各有一张时间表,内有数个时间段
只需将第二个人的时间表中的时间段放到第一个人的时间表中与其时间段逐个比较
对发生重合的时间长度累加即可

当然比较的时候不需全部遍历第一个人的时间表
考虑到时间表按时刻递增排序
如果第二个人的某个时间段如[4, 5]不能与第一个人的时间段[7, 8]产生交集,则其与[7, 8]之后的时间段也必不产生交集,这时就可以跳出循环,转而统计第二个人的下一个时间段

另外要注意的点是时间段的重合分类
设第一人的某时间段坐标为[a, b]
第二人的某时间段坐标为[c, d]
有三大种共六小种情况
在讨论时注意要包含所有边界点重合的情况(例如 [4, 5]和[5, 7])

Talk is cheap, show me the code.

满分代码

# 传入第一个人的完整时间表,第二个人的一个时间段
def talk_time_counter(first_schedule, stp):
    # 第二个人的时间段有多少时间与第一个人的时间表重合
    talk_time = 0

    # 第二人时间段的坐标
    c = stp[0]
    d = stp[1]

    for ftp in first_schedule:
        a = ftp[0]
        b = ftp[1]

        # 第一大种情况,第二人时间段开始于第一人某时间段左侧
        if c < a:
            # 1.1 结束于第一人时间段左侧,则与第一人后面的时间段也不会重合
            if d <= a:
                break
            # 1.2 结束于第一人时间段中
            elif a < d and d <= b:
                talk_time += d-a
            # 1.3 结束于第一人时间段后
            elif b < d:
                talk_time += b-a

        # 第二大种情况,第二人时间段开始于第一人某时间段中
        elif a <= c and c < b:
            # 2.1 结束于第一人时间段中
            if a <= d and d < b:
                talk_time += d-c
            # 2.2 结束于第一人时间段后
            elif b <= d:
                talk_time += b-c

        # 第三大种情况,第二人时间段开始于第一人某时间段后
        elif b <= c:
            pass

    return talk_time


if __name__ == '__main__':
    time_period_num = int(input())
    first_schedule = []
    second_schedule = []
    for tp in range(time_period_num):
        first_schedule.append(list(map(int, input().split())))
    for tp in range(time_period_num):
        second_schedule.append(list(map(int, input().split())))

    final_talk_time = 0
    for stp in second_schedule:
        final_talk_time += talk_time_counter(first_schedule, stp)
    print(final_talk_time)

发布了61 篇原创文章 · 获赞 11 · 访问量 4843

猜你喜欢

转载自blog.csdn.net/weixin_43249758/article/details/104426100