CCF 201812-2 小明放学 python 满分

    科技2022-07-10  118

    CCF 201812-2 小明放学 python 满分

    题目叙述问题描述:略输入格式:略输出格式:略样例 满分证明解题思路反例(我自己思路,超时)大佬版 满分代码反例(我自己思路,超时)大佬版

    题目叙述

    问题描述:略

    输入格式:略

    输出格式:略

    样例

    0 10 1 5 0 11 2 2 0 6 0 3 3 10 0 3 样例输出 46 样例输入 30 3 30 3 0 100 1 5 0 11 样例输出 142

    满分证明

    解题思路

    反例(我自己思路,超时)

    类似穷举法,模拟全过程

    大佬版

    边读取边处理 (1)遇到0 直接累加 (2)遇到1,红灯,直接跳到绿灯时间 (3)遇到2,黄灯,同样道理

    每次都多加了绿灯时间

    后面判断等待时间有没有

    tem_time = (m_time-total) % (r + g + y) 最厉害的一条命令,这个地方是对取余最深刻而理解,哪怕m_time-total为负值

    后面判断是否大于绿灯等待时间,大于那就需要再加;如果不,这时间点落在之前多加的绿灯区间,不管。

    满分代码

    反例(我自己思路,超时)

    r, y, g = map(int, input().split()) n = int(input()) hf = 0 count = 0 def xs(xd, t): fl, ft = xd while 1: # 如果是红灯 if fl == 1: if ft - t < 1: fl = 3 t = t - ft ft = g else: ft = ft - t break # 如果是黄灯 elif fl == 2: if ft - t < 1: fl = 1 t = t - ft ft = r else: ft = ft - t break # 如果是绿灯 elif fl == 3: if ft - t < 1: fl = 2 t = t - ft ft = y else: ft = ft - t break return [fl, ft] for i in range(n): m_type, m_time = map(int, input().split()) temp = 0 if m_type == 0: temp = m_time hf += temp else: nw = xs([m_type, m_time], hf) if nw[0] == 1: temp = nw[1] hf += temp elif nw[0] == 2: temp = nw[1] + r hf += temp count += temp print(count)

    大佬版

    r, y, g = map(int, input().split()) n = eval(input()) total = 0 for _ in range(n): m_type, m_time = map(int, input().split()) if m_type == 0: total += m_time continue elif m_type == 1: m_time += g elif m_type == 2: m_time += (r + g) tem_time = (m_time-total) % (r + g + y) if tem_time > g: total += (tem_time - g) print(total)
    Processed: 0.008, SQL: 8