交通
算法描述
- 市民们抱怨红绿灯设置得不合理,导致路上的时间太长
- 交通局应市民要求,给出了红绿灯的控制算法
- 在此场景中,请你计算出已知红绿灯控制算法的情况下,一辆车通过一段路程所需的总时间
- 信号灯算法:一共只有红灯或绿灯两个状态,初始状态都是绿灯,给出信号持续时间的数组
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();
}