思路
可知,每当过r+y+g时间时为一轮回,与刚开始出发时的各个红绿灯的情况相同,所以在考虑每个红绿灯是什么情况时,采用对总时间取余的方法,即下方代码中的re。
- k=0的情况
直接相加。
- k=1的情况
总体情况如图所示,则需分别判定re是否位于两个红框内。
第一个红框表示为re<t(此时没有=,由于当re=t时不需要等待)。此范围内需要等待的时间为t-re
第二个红框表示为g+t<=re<=y+g+r,而由于re始终<=y+g+r,所以只需写为g+t<=re(此时有=由于刚好为黄灯是需要等待的)。此时等待时间为y+r-(re-(g+t)),化简为y+r+g+t-re - k=2的情况
第一个红框表示为re<t+r,此时需要等待时间为t+r-re
第二个红框表示为re>=t+r+g,等待时间为y+r-(re-(t+r+g))化简为y+2r+g+t-re - k=3的情况
只有一个红框,所以为t<=re<=y+r+t.此时需要等待时间为y+r+t-re。
代码
r,y,g=list(map(int,input().split()))
n=int(input())
result=0
for i in range(n):
k,t=list(map(int,input().split()))
re=result%(r+y+g)
if k==0:
result+=t
elif k==1:
if t+g<=re:
result+=y+g+r+t-re
if re<t:
result+=t-re
elif k==2:
if re<t+r:
result+=t+r-re
if re>=t+r+g:
result+=t+2*r+y+g-re
elif k==3:
if t<=re<=t+y+r:
result+=y+r+t-re
print(result)