题解
2024-03-17 11:11:34
发布于:陕西
50阅读
0回复
0点赞
// 这一题就是纯正的物理题,搞不懂和编程有什么关系
// 不过它的分类讨论也有一点点的繁琐
// 但是比起高三的时候做的运动学问题已经好很多了
// 要注意这一题有一个坑点:
// 就是不是[0, d]的最大速度为w,而是只要通过d这一点时
// 速度为w即可,为了这个点我还WA了一发
// 详见代码里面的注释
#include <iostream>
#include <cmath>
// 返回以初速为v1,最大速率为v2,加速度为a,通过l的最短时间
double Move(double v1, double v2, double a, double l)
{
double t = 0.0;
double s = (v2 * v2 - v1 * v1) / 2 / a;
if (s >= l)
{
t = (-v1 + std::sqrt(v1 * v1 + 2 * a * l)) / a;
}
else
{
double t1 = (v2 - v1) / a;
double t2 = (l - (v2 * v2 - v1 * v1) / 2 / a) / v2;
t = t1 + t2;
}
return t;
}
int main()
{
double a, v, l, d, w, t;
std::cin >> a >> v >> l >> d >> w;
double s = v * v / 2 / a;
if (w >= v) // 如果最大速率还达不到限速,那就一直开过去就好了
{
t = Move(0, v, a, l);
}
else
{
double s1 = w * w / 2 / a;
if (s1 >= d) // 如果一直加速到d还没达到限速w
{ // 那就一直开过去没事的
t = Move(0, v, a, l);
}
else // 这里的讨论就需要自己动手画个图,解一下简单的方程了
{
double t11 = std::sqrt((2 * a * d + w * w) / 2 / a / a);
double t1; // [0, d]的总时间
if (t11 * a <= v) // 加速到某一速度然后减速到w通过d
{
t1 = 2 * t11 - w / a;
}
else // 先加速到v,然后匀速行驶一段,最后减速到w通过d
{
double s11 = v * v / 2 / a; // 加速阶段走的路程
double s12 = (v * v - w * w) / 2 / a; // 减速阶段走的路程
t1 = v / a + (v - w) / a + (d - s11 - s12) / v;
}
double t2 = Move(w, v, a, l - d); // 通过d后一直到l的时间
t = t1 + t2;
}
}
std::printf("%.12f\n", t);
return 0;
}
全部评论 1
std::printf("%.12f\n", t); return 0;
}
2024-07-24 来自 北京
0
有帮助,赞一个