算法十

交通

算法描述

  • 市民们抱怨红绿灯设置得不合理,导致路上的时间太长
  • 交通局应市民要求,给出了红绿灯的控制算法
  • 在此场景中,请你计算出已知红绿灯控制算法的情况下,一辆车通过一段路程所需的总时间
  • 信号灯算法:一共只有红灯或绿灯两个状态,初始状态都是绿灯,给出信号持续时间的数组lights,数组中信号灯按照汽车经过的顺序排列
  • 每个信号灯之间相隔150米,汽车在第一个信号灯之前150米起步,在最后一个信号灯之后的150米停下来,假设汽车没有加速、减速,速度要么是0,要么就是以speed米/秒匀速行驶
  • 返回汽车到达终点时所需的时间,最后的时间需将小数部分去掉(55.5取55,44.9取44)

参数定义

  • 类名 Traffic
  • 方法 time
  • 输入参数 vector <int>, int
  • 输出 int
  • 方法声明 int time(vector <int> lights, int speed)

限制条件

  • speed 可以为如下大小:5, 10, 15, 20, 25, or 30.
  • lights 包含[1, 50]个元素
  • lights 中的每个元素都是整数,大小在[10, 60]之间

例子

  • 输入
    • lights: {10,10,10}
    • speed: 30
  • 输出
    • 30

在time = 5时,汽车到达第一个信号灯, 信号灯依然是绿灯,汽车直接通过
在time = 10时,汽车到达第二个信号灯, 刚好变红1. 等待10秒,变绿
在time = 20时, 信号灯变绿,汽车立即以30米/秒的速度行驶而过
在time = 25时,汽车到达第三个信号灯,绿灯,直行
在time = 30时,汽车到达终点(第三个信号灯的后150米)

测试实例

  • 实例一

    • 输入

      • {10,10,10}
      • 20
    • 输出

      • 35
  • 实例二

    • 输入
      • {10,20,30}
      • 20
    • 输出
      • 30
  • 实例三

    • 输入
      • {10,11,12,13,14,15}
      • 5
    • 输出
      • 240
  • 实例四

    • 输入
      • {60,60,60,60,60,60,60,60,60,60}
      • 5
    • 输出
      • 630
  • 实例四

    • 输入
      • {55,29,26,12,19,39,18,20,23,28,56,20,59,48,33,40,30,60,19}
      • 25
    • 输出
      • 252

代码

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

class Traffic {
public:
    int time(vector<int> lights, int speed) {
        float totalTime = 0.0;
        // loop for each route, calcute the time
        for(vector<int>::const_iterator iter = lights.cbegin(); iter < lights.cend(); iter++) {
            // add the iter'th route time to the total time
            totalTime += 150.0 / speed;
            // judge if stop is needed, if needed, add the wait time
            int needStop = totalTime / (*iter);
            if(0 != needStop % 2)
                totalTime += *iter - fmod(totalTime, (*iter));
        }
        totalTime += 150.0 / speed;
        return floor(totalTime);
    }
};

int main() {
    vector<int> lights {55,29,26,12,19,39,18,20,23,28,56,20,59,48,33,40,30,60,19};
    int speed = 25;
    Traffic tc;
    int ret = tc.time(lights, speed);
    cout << ret << endl;
    cout.flush();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值