一、问题链接
二、思路
红、绿、黄灯依次循环亮起,红灯黄灯时等待,绿灯时通行。
关键在于判断小明到达路口时灯的颜色,由于信号灯按红、绿、黄的顺序循环往复,对于循环问题采用取余的方法进行处理。
注意,所用的时间需用long long
类型。
三、参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int r,y,g;
int n,k,t;//k:0一段道路,1 2 3红黄绿
cin>>r>>y>>g>>n;
long long sum=0;//注意long long类型
while(n--){
cin>>k>>t;
if(k==0) sum+=t;
else{//红绿灯顺序为红绿黄,红灯停止
if(k==1){//初始红灯
//红绿黄
t=r-t;//红灯持续亮了了多少秒
int temp=(sum+t)%(r+y+g);//距离红灯亮起过去了sum+t
if(temp-r<0){//到达路口时,亦然是红灯
sum+=r-temp;
continue;
}else if(temp>=r+g){//到达路口时,黄灯
sum+=y-(temp-r-g)+r;
continue;
}
}
if(k==2){//初始黄灯
//黄红绿
t=y-t;
int temp=(sum+t)%(r+y+g);
if(temp-y-r<0){//黄灯或者红灯
sum+=r+y-temp;
continue;
}
}
if(k==3){//初始绿灯
//绿黄红
t=g-t;
int temp=(sum+t)%(r+y+g);
if(temp-g>=0){//黄灯或者红灯
sum+=r+y-(temp-g);
continue;
}
}
}
}
cout<<sum;
return 0;
}