题目背景
汉东省政法大学附属中学所在的光明区最近实施了名为“智慧光明”的智慧城市项目。具体到交通领域,通过“智慧光明”终端,可以看到光明区所有红绿灯此时此刻的状态。小明的学校也安装了“智慧光明”终端,小明想利用这个终端给出的信息,估算自己放学回到家的时间。
问题描述
一次放学的时候,小明已经规划好了自己回家的路线,并且能够预测经过各个路段的时间。同时,小明通过学校里安装的“智慧光明”终端,看到了出发时刻路上经过的所有红绿灯的指示状态。请帮忙计算小明此次回家所需要的时间。
输入格式
输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
输入的第二行包含一个正整数 n,表示小明总共经过的道路段数和路过的红绿灯数目。
接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,将会耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示出发时刻,此处的红绿灯状态是红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。
输出格式
输出一个数字,表示此次小明放学回家所用的时间。
样例输入
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
样例输出
46
样例说明
小明先经过第一段路,用时 10 秒。第一盏红绿灯出发时是红灯,还剩 5 秒;小明到达路口时,这个红绿灯已经变为绿灯,不用等待直接通过。接下来经过第二段路,用时 11 秒。第二盏红绿灯出发时是黄灯,还剩两秒;小明到达路口时,这个红绿灯已经变为红灯,还剩 11 秒。接下来经过第三、第四段路,用时 9 秒。第三盏红绿灯出发时是绿灯,还剩 10 秒;小明到达路口时,这个红绿灯已经变为红灯,还剩两秒。接下来经过最后一段路,用时 3 秒。共计 10+11+11+9+2+3 = 46 秒。
评测用例规模与约定
有些测试点具有特殊的性质:
* 前 2 个测试点中不存在任何信号灯。
测试点的输入数据规模:
* 前 6 个测试点保证
n
≤
1
0
3
n ≤ 10^3
n≤103。
* 所有测试点保证
n
≤
1
0
5
n ≤ 10^5
n≤105。
注意事项 || 思路
最终的结果以及时间,要用long long 数据类型来保存,用int的话只有60分。
题目中给出的红绿灯的顺序,与现实生活中红绿灯的顺序要转换清楚,可以通过画图来理解,否则容易转晕
∣
−
−
−
r
e
d
−
−
−
∣
−
−
−
g
r
e
e
n
−
−
−
∣
−
−
y
e
l
l
o
w
−
−
∣
|---red---|---green---|--yellow--|
∣−−−red−−−∣−−−green−−−∣−−yellow−−∣
我的代码:
#include <iostream>
using namespace std;
//|---red---|---green---|--yellow--|
int red,yellow,green;
int judge(long long time){//用来判断当前时间的红绿灯状态
if(time >= 0 && time < red){
return 1;//red
}else if(time >= red && time < red + green){
return 3;//green
}else{
return 2;//yellow
}
}
long long Deal(int type,long long time,long long current){
int total = yellow + red + green;
long long answer;
if(type == 0){//如果当前是一段道路,不管什么时候经过,需要的时间不变
return time;
} else if(type == 1){//red
time = red - time;//time用来存储出发时处在“红绿灯循环”中的位置
} else if(type == 2){//yellow
time = red + yellow + green- time;//time与上边同理
} else if(type == 3){ //green
time = red + green - time;//time与上边同理
}
//(time+current)%total记录当钱所在红绿灯循环中的位置
time = (time + current) % total;
if(judge(time) == 1){//如果当前为红灯
answer = red - time;//answer存储等待时间
} else if(judge(time) == 3){//如果当前为绿灯
answer = 0;//直接通过,answer为0
} else{//若为黄灯 需要等黄灯结束后,再等红灯结束才能通过
answer = red + green + yellow - time + red;
}
return answer;
}
int main(){
long long answer = 0;
cin >> red >> yellow >>green;
int n;
cin >> n;
while(n--){
int k,t;
cin>>k>>t;
//Deal(k,t,answer)中的answer为当前经过的时间
answer += Deal(k,t,answer);
}
cout<<answer;
return 0;
}