设从起点走到红绿灯用时 t = d v t= \frac{d}{v} t=vd ,
令 k = t g + r , t r = t % ( g + r ) k=\frac{t}{g+r},\ tr=t \% (g+r) k=g+rt, tr=t%(g+r) ,
如果 t r < g tr < g tr<g ,那么从起点走到红绿灯总用时为 t 1 = k × ( g + r ) + t r t_1=k\times (g+r)+tr t1=k×(g+r)+tr ,
如果 t r ≥ g tr \ge g tr≥g ,那么从起点走到红绿灯总用时为 t 1 = k × ( g + r ) + ( g + r ) t_1=k\times (g+r) +(g+r) t1=k×(g+r)+(g+r) ,
再加上剩下的时间, t 2 = l − d v t_2=\frac{l-d}{v} t2=vl−d ,
综上所述,总用时即为 T = t 1 + t 2 T=t_1+t_2 T=t1+t2 。
注:
double fmod(double x, double y); // 返回值为 x % y
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define endl '\n'
#define PI acos(-1)
#define LL long long
#define INF 0x3f3f3f3f
#define lowbit(x) (-x&x)
#define PII pair<int, int>
#define PIL pair<int, long long>
#define mem(a, b) memset(a, b, sizeof a)
#define rev(x) reverse(x.begin(), x.end())
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
void solve() {
double l, d, v, g, r, t, tt;
cin >> l >> d >> v >> g >> r;
t = d / v;
tt = floor(t / (g + r));
t = fmod(t, g + r);
if (t >= g) t = g + r;
printf("%.6lf\n", tt * (g + r) + t + (l - d) / v);
}
int main() {
IOS;
solve();
return 0;
}