CCF认证模拟-201812-2-小明放学-python
题目
思路
题目分析:
首先应该明确红绿灯的变换顺序:
其次是对各种灯对应的等待时间的判断:
到达路口时,当遇到绿灯,则直接通行
到达路口时,当遇到红灯,则等待相对应的时间
到达路口时,当遇到绿灯,则等待 黄灯相对应的时间,并且需要等待一个红灯的时间 才能通行
之后,因为题目中所给的是还没有出发前的红绿灯状况,所以需要推算出到达路口时的红绿灯状态(在代码中批注)
最后还有一个需要区分的点是,当小明从出发到遇到红绿灯时所用的时间还不够红绿灯变换一次的时间,此时所需等待的时间和其他情况也有区分
代码示例
代码只能保证是对的,可以得100分,但肯定不是最优解,只是对自己思路的一种体现
a = list(map(int, input().split()))
b = int(input())
c = []
for i in range(b):
d = list(map(int, input().split()))
c.append(d)
dis = 0 # 最后的总时间
for j in c:
# 此处计算余数,因为若时间间隔大于一个红绿灯轮回,则状态是一样的
k = dis % (a[0]+a[1]+a[2])
# 没有红绿灯的地方
if j[0] == 0:
dis = dis + j[1]
# 出发时是红灯
elif j[0] == 1:
# 当此时所用的时间还不到红绿灯所指示的时间时
if j[1]-k > 0:
dis = dis + (j[1]-k)
# 到达时是黄灯,需要再额外等待一整个红灯的时间
elif a[2] <= abs(j[1] - k) < a[2]+a[1]:
dis = dis + (a[2]+a[1] - abs(j[1] - k)) + a[0]
# 到达时是绿灯
elif 0 <= abs(j[1] - k) < a[2]:
continue
# 到达时是红灯
elif a[2]+a[1] <= abs(j[1] - k) < a[2]+a[1]+a[0]:
dis = dis + (a[2]+a[1]+a[0] - abs(j[1] - k))
# 出发时是黄灯
elif j[0] == 2:
# 当此时所用的时间还不到红绿灯所指示的时间时
if j[1]-k > 0:
dis = dis + (j[1]-k) + a[0]
# 到达时是黄灯,需要再额外等待一整个红灯的时间
elif a[0]+a[2] <= abs(j[1] - k) < a[0]+a[2]+a[1]:
dis = dis + (a[0]+a[2]+a[1]-abs(j[1] - k)) + a[0]
# 到达时是绿灯
elif a[0] <= abs(j[1] - k) < a[0]+a[2]:
continue
# 到达时是红灯
elif 0 <= abs(j[1] - k) < a[0]:
dis = dis + (a[0]-abs(j[1] - k))
# 出发时是绿灯
elif j[0] == 3:
# 当此时所用的时间还不到红绿灯所指示的时间时
if j[1]-k > 0:
continue
# 到达时是黄灯,需要再额外等待一整个红灯的时间
elif 0 < abs(j[1] - k) <= a[1]:
dis = dis + (a[1] - abs(j[1]-k)) + a[0]
# 到达时是绿灯
elif a[1]+a[0] <= abs(j[1] - k) < a[1]+a[0]+a[2]:
continue
# 到达时是红灯
elif a[1] <= abs(j[1] - k) < a[1]+a[0]:
dis = dis + (a[1]+a[0] - abs(j[1] - k))
print(dis)