题目就不再重述,显得累赘,可自行搜索。
我的思路是,黄灯亮起后,在y+r时间段内小明到达路口只能等待,过了这段时间,在绿灯亮起后就可以通过了,绿灯之后又是红灯,如此循环往复。
现在直接上代码,长度比较短的,要点都在注释里
#include<iostream>
using namespace std;
int main()
{
long long int r,y,g,t=0; //long long 千万要注意
cin>>r>>y>>g;
long long int n; //long long 千万要注意
cin>>n;
for(int i=0;i<n;i++)
{
long long int a,b; //long long 千万要注意
cin>>a>>b;
if(a==0) //没有红绿灯
t+=b;
else if(a==1) //红灯
b=(y+(r-b)+t)%(r+y+g); //小明到路口时距上一个黄灯刚开始亮起时的时间
else if(a==2) //黄灯
b=(y-b+t)%(r+y+g);
else //绿灯
{
b=(y+r+(g-b)+t)%(r+y+g);
}
if(a)
{
if(b<y+r) //如果距黄灯刚亮起的时间小于红灯黄灯所用时间之和
{ //则需要等待,等待时间为过完剩下的时间
t+=y+r-b;
}
}
}
cout<<t<<'\n';
//system("pause");
return 0;
}