题目描述:
Jim马上就要结婚了,尽管Jim自己本身不是很有钱,但他还是一个很讲究”排面”的人。没有什么能 比得上长长的婚车队列更吸引眼球。为了宴请八方,Jim包了 q 辆车来接送亲友。不过,由于Jim 的亲戚朋友到达时间不同,每辆车的出发时间也不同。为了更好的迎接宾客,Jim希望能知道每辆车到达目的地的时间。
我们可以将起点到目的地的路线看作一条经过 n 个十字路口的直线,在每一个路口都有一个红绿灯,并且在红灯和绿灯之间周期性切换。一开始,红绿灯显示为绿灯。绿灯将会持续 g 秒钟,此时,车允许通行。之后转换为红灯,红灯持续 r 秒钟。当红绿灯显示为红灯时,只有以下一种情况要停车,既如果车刚好到达十字路口时,红绿灯显示为红灯,则要停车等待,等转换为绿灯后继续通行。但是,如果车刚好到达十字路口时,红绿灯刚好转换为绿灯,则无需等待。另外,车在两个十字路口之间的路上行驶时,无论是否红灯,都可以通行。
在此基础上,所有的红绿灯都是同步的,及所有的红绿灯转换周期都一样。所有红绿灯开始都为绿色。
在整个路线上,有 n + 1 个路段。一个路段指的是两个连续的红绿灯或者红绿灯与起点(或终点)之间的一段路。从起点到第一个红绿灯为一个路段,每两个连续的红绿灯之间为一个路段, 最后一个红绿灯与终点为一个路段。每一辆车通过每一路段的时间为 li 。Jim提供 n + 1 个正整数 li ( 1 ≤ i ≤ n + 1,1 ≤ li ≤ 10^9 ),代表车通过从起点到终点的第 i 个路段的时间为 li秒钟。 l1就表示车通过从起点到第一个红绿灯的时间。l_n+1则表示车通过最后一个红绿灯到终点的时间。
q 辆车每辆车的出发时间为 ti 秒。计算每辆车到达终点的时间,(车辆视作质点,且不会互相阻碍)
输入:
单组测试数据。
第一行,有三个以空格隔开的正整数n,g,r(1≤n≤2*10^5,2≤g+r≤2*10^9)分别表示十字路口的个数,绿灯持续的秒数,红灯持续的秒数。
接下来一行有n+1个整数li(1≤i≤n+1,1≤li≤10^9)表示通过第i个路段所需要的时间。
接下来一行有一个整数q(1≤q≤2*10^5)车的数量。
接下来有q行,每一行有一个整数ti(1≤i≤q,1≤ti≤10^9)表示第i辆车从起点出发的时间。
输出:
有q行,每行一个整数,第i行表示第i辆车到达终点的最快时刻。
样例输入:
4 5 1
12 18 4 6 7
5
4
11
5
3
2
样例输出:
51
59
53
50
49
#include<iostream>
#include<cstdio>
#include<stdio.h>
using namespace std;
long long n,g,r,q;
long long rdt[200010],cft;
bool hhh=false;
int main(){
cin>>n>>g>>r;
long long time=g+r;
for(long long i=1;i<=n+1;i++){
cin>>rdt[i];
}
cin>>q;
for(long long i=1;i<=q;i++){
cin>>cft;
long long now=cft;
for(long long j=1;j<=n+1;j++){
now+=rdt[j];
if(now%time==0) continue;
if(now%time<g){
continue;
}else{
now+=r;
hhh=true;
}
}
if(hhh==true) cout<<now-1<<endl;
else cout<<now<<endl;
hhh=false;
}
return 0;
}