每次计算时候,用当前已有时间sum对 (r+g+y)取余,将红绿灯时间变化范围缩短在r+g+y范围内。这样可以避免多次循环,从而将问题简单化,同时要注意在黄灯时,时间需要+r
using namespace std;
#include<bits/stdc++.h>
int main(){
int r,y,g;
int n,k,t,s;
long long sum;
cin>>r>>y>>g;
cin>>n;
int i,tmp;;
sum=0;
s=r+y+g;
for(i=0;i<n;i++){
cin>>k>>t;
if(k == 0) sum+=t;//道路直接走
else if(k == 1){//红灯
tmp=sum%s;
if(tmp<=t){
sum=sum+t-tmp;
}
else if(tmp>t && tmp<=g+t){
sum+=0;
}
else if(tmp>t+g && tmp<=t+g+y){
sum=sum+t+g+y-tmp+r;
}
else{
sum=sum+s-tmp+t;
}
}
else if(k == 2){//黄灯
tmp=sum%s;
if(tmp<=t){
sum=sum+t-tmp+r;
}
else if(tmp>t && tmp<=r+t){
sum=sum+r+t-tmp;
}
else if(tmp>r+t && tmp<=r+t+g){
sum+=0;
}
else{
sum+=s-tmp+t+r;
}
}
else if(k == 3){//绿灯
tmp=sum%s;
if(tmp<=t){
sum+=0;
}
else if(tmp>t && tmp<y+t){
sum+=y+t+r-tmp;
}
else if(tmp>=y+t && tmp<y+r+t){
sum+=y+r+t-tmp;
}
}
}
cout<<sum;
return 0;
}