1. 程式人生 > >CCF-201812-2-小明放學

CCF-201812-2-小明放學

題目大意:
這題和第一題的區別在於,小明事先得知路況(路口通過時間和交通燈資料),走之前預測估算走多少時間,不再是第一題那樣走多少記多少。

思路:
由於沒有親自去走,所以需要模擬人去走,得到走的總時間,遇到路口就加時間,遇到交通燈的時候,通過總時間和交通燈一開始的情況推算出,現在交通燈情況,用現在交通燈情況就可以像第一題那樣加時間。

細節:
1.推算時注意題目交通燈的標號(1-紅,2-黃,3-綠),然後紅綠燈執行順序是((0)紅–>(1)綠–>(2)黃),到時候進行推算的時候要進行下標與標號的轉換,把123一一對應成012。下標往前推進的時候,通過模運算保證下標一直是0,1,2。

2.不要一個個燈去推(要不然就超時了,嗚嗚嗚~~這次考試的時候就是這樣,最後才70分),因為紅綠燈是週期執行的,總時間可以減去前面的週期時間,剩下最後一個週期時間,再在這個週期時間內推算交通燈的情況

python程式碼:

def comput(light, time, total, r, y, g):
    # 紅-->綠-->黃
    lights = [r, g, y]

    # 轉換下標
    # 123ryg-->012rgy
    if light == 1:
        light = 0
    elif light == 3:
        light = 1

    # 先減去第一個燈的剩餘時間
    total -= time

    # 燈變成下一個燈
    light = (light + 1) % 3

    if total < 0:
        return (light - 1) % 3, -total

    # 減去前面重複的週期
    total -= total // (r + y + g) * (r + y + g)
    while total >= 0:
        total -= lights[light]
        light = (light + 1) % 3
    return (light - 1) % 3, -total


# 主邏輯
r, y, g = map(int, input().split())
n = int(input())
total = 0
for i in range(n):
    k, t = map(int, input().split())
    # 通過路口
    if k == 0:
        total += t
    # 遇到交通燈
    else:
        # 推算出當前交通燈的情況
        k, t = comput(k, t, total, r, y, g)
        # 紅燈
        if k == 0:
            total += t
        # 黃燈
        elif k == 2:
            total += t + r
print(total)