求助站外题
  • 板块灌水区
  • 楼主qwcdim
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/6/27 15:44
  • 上次更新2023/11/4 21:24:50
查看原帖
求助站外题
455139
qwcdim楼主2021/6/27 15:44

rt,就是不知道为啥时间超限得了5分...求大佬请教

题目描述:

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;
}
2021/6/27 15:44
加载中...