Python-CCF:20181202 小明放学

题目描述

在这里插入图片描述

用时

1h,太长了,而且这道题就是在第一题的基础上稍作改动
不过是一遍过
比去年强
在这里插入图片描述

思路

本题把第一题给出的到达时的红绿灯状态换成了出发时的红绿灯状态
所以在第一题代码的基础上增加一个方法
把出发状态和剩余时间转换为到达状态及剩余时间即可

以前写的很乱,就是分类讨论
如果出发时是红灯怎么怎么样,到达时可能变成红灯或黄灯或绿灯
3*3一共9个判断语句
太不优雅了

然后换了个思路
把所有的灯看成一个循环中地位平等的三种状态
不对出发时灯的状态进行判断
只需判断到达时改变了几个灯
0个1个还是2个

代码

# 改变到达时的交通灯类型及剩余秒数
def type_time_changer(current_time_cost, which_type, time_left):
    # 出发时在循环0 1 2的哪个位置
    past_order = type_order_dict[which_type]

    # 出发时本种交通灯已经亮起的时间,如红灯剩余5秒则已亮起25秒
    passed_time = order_time_dict[past_order] - time_left

    # 到达时交通灯已亮起的时间,以整个循环的时间为模
    current_passed_time = (passed_time + current_time_cost) % all_ryg_time

    # 如果没有改变灯的类型或是经过了整数个循环
    if current_passed_time < order_time_dict[past_order]:
        # 类型不变
        which_type = which_type
        # 更新剩余时间
        time_left = order_time_dict[past_order] - current_passed_time
    elif current_passed_time < order_time_dict[past_order] + order_time_dict[(past_order+1) % 3]:
        # 类型变为下一个灯的类型
        which_type = order_type_dict[(past_order+1) % 3]
        # 更新剩余时间
        time_left = order_time_dict[(past_order+1) % 3] + order_time_dict[past_order] - current_passed_time
    elif current_passed_time < order_time_dict[past_order] + order_time_dict[(past_order+1) % 3] + order_time_dict[(past_order+2) % 3]:
        # 类型变为下两个灯的类型
        which_type = order_type_dict[(past_order+2) % 3]
        # 更新剩余时间
        time_left = all_ryg_time - current_passed_time

    return which_type, time_left


# 最终的计时方法
def time_counter(set_red_time, which_type, time_input):
    # 通过一段路或一个灯用的时间
    part_time = 0

    # 如果通过一段路
    if which_type == 0:
        part_time += time_input
    # 红灯则直接加上剩余秒数
    elif which_type == 1:
        part_time += time_input
    # 黄灯则加剩余秒数再加红灯时间
    elif which_type == 2:
        part_time += time_input
        part_time += set_red_time
    # 绿灯直接通过
    elif which_type == 3:
        part_time = 0

    return part_time


if __name__ == '__main__':
    # 设定好的红黄绿灯时长
    set_red_time, set_yellow_time, set_green_time = map(int, input().split(' '))

    # 一个循环的总时间
    global all_ryg_time
    all_ryg_time = set_red_time + set_yellow_time + set_green_time

    # 类型: 循环顺序的字典
    global type_order_dict
    type_order_dict = {1: 0, 2: 2, 3: 1}

    # 循环顺序: 类型的字典
    global order_type_dict
    order_type_dict = {0: 1, 2: 2, 1: 3}

    # 循环顺序: 持续时间的字典
    global order_time_dict
    order_time_dict = {0: set_red_time,  1: set_green_time, 2: set_yellow_time}

    # 道路段数+灯数=总数
    road_light_sum = int(input())

    # 当前已经花费的总时间
    current_time_cost = 0

    for rl in range(road_light_sum):
        which_type, time_left = map(int, input().split(' '))
        if which_type == 0:
            # 经过一段路则直接加所用时间
            current_time_cost += time_left
        else:
            # 先计算到达时灯的类型及剩余时间
            which_type, time_left = type_time_changer(current_time_cost, which_type, time_left)
            # 然后计算通过灯所用的时间
            current_time_cost += time_counter(set_red_time, which_type, time_left)
    print(current_time_cost)

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

猜你喜欢

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