快速公交BRT

【问题描述】

   在城市里,快速公交(BRT)线路为一条直线,在其线路上有 n 个交叉路口,在每个路口都有一个交通信号灯,在红灯与绿灯之间周期性循环。

   在绿灯亮起持续 g 秒的期间,允许通行,之后变为红灯,保持 r 秒,红灯期间禁止车辆通行。如果一辆车正好在变为红灯的时候到达交叉口,它应该停车,但是如果是正好变成绿灯,车辆就可以继续行驶。

BRT

   所有的交通灯都有相同的变化时间,并且是同步的。换句话说,对于所有的交通灯来说,红灯(和绿灯)的相位是相同的,它们都在第 0 时刻开始变为绿色。 

   BRT公司已经设计好了公交车通过每个路段的时间,路段是指两个连续的交通灯之间的距离,或者是起点与第一个交通灯的距离,或者是最后一个交通灯与终点的距离,更精确地讲,BRT专家设计了 n + 1 个正整数 li,时间以秒计,表示公交车从起点到终点时穿过第 i 路段的时间,l1 为从起点到第一个路口的时间, ln+1 表示从最后一个路口·到终点的时间。

   在一天内有 q 辆公交车离开起点,第 i 辆车在时刻 ti(以秒计)出发,公司管理者想知道公交车在什么时间可以到达终点。

【输入形式】

   输入的第一行为三个整数 n、g、r,分别表示交叉路口的个数,绿灯持续的时间和红灯持续的时间。

   接下来一行为 n + 1 整数 li , i =1, ..., n + 1,表示公交车通过第 i 个路段的时间。

   接下来的一行为单一的一个整数 q,表示一天内从起点出发的公交车数量,接下来的一行为 q 个整数,表示每辆公交车离开起点的时间。

【输出形式】

   输入为一行 q 个整数,分别表示每辆公交车到达终点的时间。

【样例输入】
1 3 2
5 2
5
1 2 3 4 5

【样例输出】

8 9 12 12 12

#include
using namespace std;
int main()
{
	int n,g,r;  //定义
	cin>>n>>g>>r;
	int a[n+1];  //定义数组a存储路段运行时间
	for(int i=0;i<n+1;i++)  //输入数据
	{
		cin>>a[i];
	}
	int q;
	cin>>q;
	int b[q];  //定义数组b存储公交车出发时间
	for(int i=0;i<q;i++)  //输入数据
	{
		cin>>b[i];
	}
	for(int x=0;x<q;x++)  //循环,输出公交车到达时间
	{
		int time=b[x]+a[0];   //定义time记录公交车到达路口的时间
		for(int y=0;y<n;y++)   //循环,路口时时间判断
		{
			int t=time/(g+r);   //定义t存储红绿灯变换次数
			if((time>=t*(g+r))&&(time<t*(g+r)+g))
			{  //当到达时间位于可通行时间内
				time=time+a[y+1];  //时间直接加上下一段路程通过时间
			}
			else time=(t+1)*(g+r)+a[y+1];
			//否则先等到绿灯在下一段路程通过时间
		}
		cout<<time<<' ';  //输出
	}
	return 0;
 }

你可能感兴趣的:(c++)