【问题描述】
在城市里,快速公交(BRT)线路为一条直线,在其线路上有 n 个交叉路口,在每个路口都有一个交通信号灯,在红灯与绿灯之间周期性循环。
在绿灯亮起持续 g 秒的期间,允许通行,之后变为红灯,保持 r 秒,红灯期间禁止车辆通行。如果一辆车正好在变为红灯的时候到达交叉口,它应该停车,但是如果是正好变成绿灯,车辆就可以继续行驶。
所有的交通灯都有相同的变化时间,并且是同步的。换句话说,对于所有的交通灯来说,红灯(和绿灯)的相位是相同的,它们都在第 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<iostream>
using namespace std;
int main() {
int n=0,g=0,r=0,q=0;//n-路口数 g-绿灯持续时间 r-红灯持续时间 q-公交车数量
cin>>n>>g>>r;//定义过先输入 因为后面定义动态数组要用到n!!!!!!!! !!!!!
int*l=new int[n+1];//通过路段的时间
int*t=new int[q];//出发时间
int fs=0;//记录到达时间
int time=0;//标准时间
for(int i=0; i<n+1; i++) {
cin>>l[i];//每段时间
}
cin>>q;
for(int i=0; i<q; i++) {
cin>>t[i];//出发时间
}
for(int j=0; j<q; j++) {
time=0;
fs=0;
time+=t[j];//发车
for(int k=0; k<n+1; k++) {
time+=l[k];
fs+=l[k];//先走一段 累加时间 再对红灯判断
if(time%(g+r)>=g&&k!=n){//走完最后一段路程没有红灯
fs+=(r+g)-(time%(g+r));
time+=(r+g)-(time%(g+r));//fs与time顺序不可颠倒 因为time的值发生了变化
}
}
cout<<fs+t[j]<<" ";
}
return 0;
}
深刻教训:定义动态数组时 要注意表示数组长度的量 是否已经输入
(cin那行与l[n+1]那行顺序不可颠倒) 改了我两个小时才发现。。。。。。