#include <iostream>
using namespace std;
int r, y, g;
int n;
int k;
int t;
long long sum = 0;
int sum1 = 0;
int main(){
cin >> r >> y >> g;
cin >> n;
while(n){
cin >> k >> t;
if(k == 0){
sum += t;
}
else if(k == 1){
sum1 = sum % (r+g+y);
if(sum1 < t){
sum += t - sum1;
}
else if(sum1 >= t && (sum1 < t+g)){
;
}
else if(sum1 >= t+g && sum1 < t+g+y){
sum += t+g+y-sum1+r;
}
else if(sum1 >= t+g+y && sum1 < r+g+y){
sum += r+g+y+t-sum1;
}
}
else if(k == 2){
sum1 = sum % (r+g+y);
if(sum1 < t){
sum += t-sum1+r;
}
else if(sum1 >= t && sum1 < t+r){
sum += t+r-sum1;
}
else if(sum1 >= t+r && sum1 < t+r+g){
;
}
else if(sum1 >= t+r+g && sum1 < r+g+y){
sum += r+g+y+t-sum1+r;
}
}
else if(k == 3){
sum1 = sum % (r+g+y);
if(sum1 < t){
;
}
else if(sum1 >= t && sum1 < t+y){
sum += t+y-sum1+r;
}
else if(sum1 >= t+y && sum1 < t+r+y){
sum += t+r+y-sum1;
}
else if(sum1 >= t+r+y && sum1 < r+g+y){
;
}
}
n--;
}
cout << sum;
return 0;
}
解释:
该题给出的红绿灯时间可以理解为动态时间,时间是随着路程和红绿灯本身时间会改变。可能出现多轮红绿灯时间,我们对此可以直接对整体红绿灯时间取余,留下的剩余时间就是到了该红绿灯口时,需要倒数的时间长短。
对红绿黄三种颜色的灯,都分为四种情况,第一种就是在本颜色灯范围内的时间,第二种是在本颜色范围外加上邻近颜色的时间,如果遇到了绿灯,那么不需要做任何改变,直接通行,第三种是在本颜色和邻近颜色外,在邻近颜色的邻近颜色内的时间,第四种是比第三种时间长,但是比总的红绿黄时间短。
对于剩余时间,需要和到达红绿灯路口的情况进行比较,如果满足条件,则对应的把剩余时间减去,得到的值加给总量sum。
建议:
大家画一个数轴理解为什么总量的加法是这样的式子,比较好理解。