P7190 [COCI2007-2008#6] SEMAFORI红绿灯时间问题

题目描述

Luka 在开卡车,路上有很多信号灯。

对于每个信号灯,他都知道红灯和绿灯亮的时间(循环不断重复)。

Luka 开始开车时,所有交通信号灯都呈红色,并且开始循环。

Luka 每秒移动 1 个距离单位。当交通信号灯为红色时,他要停车,直到它变成绿色。

编写一个程序,确定 Luka 需要多少时间才能到达路的尽头。

道路的起点在 00处,终点在 l 处。

输入格式

第一行两个数 n,l含义见题目描述。

接下来,n 行中的每行三个整数 d, r, g。 d 表示信号灯到道路起点的距离, r和 g 分别表示红色和绿色信号灯亮的时间。

信号灯将按 d升序排列。

没有两个交通信号灯将在同一位置。

输出格式

第一行,一个正整数,表示 Luka 到达路的尽头的时间。

输入输出样例

输入 #1

2 10
3 5 5
5 2 2 

输出:

12 

输入:

4 30
7 13 5
14 4 4
15 3 10
25 1 1 

观察红绿灯周期

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,l,time=0,where=0;
    cin>>n>>l;//定义红路灯个数,l距离
    int d,r,g;//d为到红绿灯的距离
    for(int i=0;i<n;i++){
        cin>>d>>r>>g;
        time+=d-where;//到达路口时间累加
        where=d;
        int now=time%(r+g);//计算周期
        if(now>=r){//如果周期余数大于红灯时间可直接通过
            continue;
        }else{//余数小于红灯时间要进行等待
      time+=r-now;//累加时间:未过去等待时间
        }
    }
    time+=l-where;//剩余的距离-现在的则为剩下的距离,又因为速度为1,所以为剩下的时间
    cout<<time;
    return 0;

}

不懂得可以在评论区进行留言哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i want to舞动乾坤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值