一道物理题
题意:开车从A行驶到C,途中经过B,AB长为d,AC长为l。初始速度为0,加速度为a,最大速度v_m,经过B时速度不能超过v_b。问从A到C最少需要多少秒?
题解:
显然,分类讨论即可
先根据v_b和v_m划分
然后再根据一直加速到达B点能否到达v_b划分
走法是很确定的——一直维持可允许的最高速行驶
#include <bits/stdc++.h>
using namespace std;
const int eps = 1e-8;
bool equal(double a, double b){
a-= b;
if(a < 0)
a = -a;
return a < eps;
}
double find_time2(double w, double x, double a, double v){
double x2 = (v * v - w * w) / (2 * a);
if(x2 <= x){
double t1 = (x - x2) / v;
return (v - w) / a + t1;
}
double maxv = sqrt(2 * a * x + w * w);
return (maxv - w) / a;
}
double a, v, l, d, w;
int main(){
while(~ scanf("%lf %lf %lf %lf %lf", &a, &v, &l, &d, &w)){
double t = sqrt((2.0 * d) / a);
double V = a * t;
V = min(v, V); //到d点最大速度
if(V <= w){
printf("%.10lf\n", find_time2(0, l, a, v));
continue;
}
double x1 = v * v / (2 * a);
double x2 = (v * v - w * w) / (2 * a);
if(x1 + x2 <= d){
double t3 = (d - x1 - x2) / v;
printf("%.10lf\n", v / a + (v - w) / a + t3 + find_time2(w, l - d, a, v));
continue;
}
double v1 = sqrt(a * d + w * w / 2);
double t1 = v1 / a, t2 = (v1 - w) / a;
printf("%.10lf\n", t1 + t2 + find_time2(w, l - d, a, v));
}
return 0;
}