CF5D Follow Traffic Rules

版权声明:虽然本蒟蒻很菜,但各位dalao转载请注明出处谢谢。 https://blog.csdn.net/xuxiayang/article/details/89811207

D e s c r i p t i o n Description

给定一条长度为 l l 的道路,现在你从原点出发向 l l 这个点行驶,你的加速度为 a a d d 这个点的限速为 w w ,你车辆的最高速度为 v v ,求行驶到 l l 点的最短时间

数据范围:不爆 d o u b l e double


S o l u t i o n Solution

一道物理题

匀速运动时: v = s t v=\frac s t
匀变速时: v = v 0 + a t v=v_0+at
位移公式: x = v 0 t + a t 2 2 x=v_0t+\frac {at^2}2
位移速度关系式: v 2 v 0 2 = 2 a x v^2-v_0^2=2ax

第四条证明:
由第三条 x = v 0 t + a t 2 2 x=v_0t+\frac{at^2}2
两边同时乘 2 a 2a 得到
2 v 0 a t + a 2 t 2 = 2 a x 2v_0at+a^2t^2=2ax
分配率
a t ( 2 v 0 + a t ) = 2 a x at(2v_0+at)=2ax
由第二条
a t ( v + v 0 ) = 2 a x at(v+v_0)=2ax
再由第二条移项得到
( v v 0 ) ( v + v 0 ) = 2 a x (v-v_0)(v+v_0)=2ax
平方差
v 2 v 0 2 = 2 a x v^2-v_0^2=2ax

简单吧。。。


设函数 f ( v 0 , v , a , l ) f(v_0,v,a,l) 表示初始速度为 v 1 v1 ,限速 v 2 v2 ,加速度 a a ,通过长度为 l l 的路程的时间

设位移距离 s = v 2 v 0 2 2 a s=\frac{v^2-v_0^2}{2a}

如果 s l s\geq l ,那么直接跑即可,得到方程 1 2 a t 2 + v 0 t l = 0 \frac 1 2at^2+v_0t-l=0 ,用公式法解得 t = v 0 + v 0 2 + 2 a l a t=\frac{-v_0+\sqrt{v_0^2+2al}}a

否则前面做加速,后面做匀速

得到 t = v v 0 a + l s v t=\frac {v-v_0}a+\frac{l-s}{v} ,即加速的时间和通过剩余路程的时间


主程序部分

s = w 2 2 a s_{特判}=\frac{w^2}{2a} ,表示加速到 w w 行驶的距离

w v   o r   s d w\geq v\ or\ s_{特判}\geq d 时,即连最高时速都没有限速那么高或者一直加速 w w 时已经过了 d d 了,这时限不限速就不重要了,直接一直加速到 v v 开过去即可, a n s = f ( 0 , v , a , l ) ans=f(0,v,a,l)

w < v w< v 时,设 t 1 t_1 表示 [ 0 d ] [0\sim d] 的时间, t 2 t_2 表示 [ d l ] [d\sim l] 的时间,显然 t 2 = f ( w , v , a , l d ) t_2=f(w,v,a,l-d)

现在我们的主要任务是求 t 1 t_1 ,我们可以模仿人的开车过程

当没有摄像头时,你一直加速到最高时速,发现前方有摄像头,你又慢慢减速到限速,我们此时就需要求出这个你开始减速的时间

又是一个一元二次方程啊。。。 t = 2 a d + w 2 2 a 2 t_{加速阶段}=\sqrt{\frac{2ad+w^2}{2a^2}}
a t v at_{加速阶段}\leq v ,那么我们来不及加速到 w w ,只能加速到某一速度,然后减速到 v v ,此时 t = t 0 t_{加速}=t_{减速到0}

得到 t 1 = t + t w = t + ( t 0 t w ) = 2 t t w = 2 t w a t_1=t_{加速阶段}+t_{减速到w}=t_{加速阶段}+(t_{减速到0}-t_{加速到w})=2t_{加速阶段}-t_{加速到w}=2t_{加速阶段}-\frac w a

否则若 a t > v at_{加速阶段}>v ,则说明我们时间足够充裕,可以先加速到 w w ,然后匀速行驶一段时间,再减速到 v v ,此时 t 1 = v a + v w a + d ( + ) v t_1=\frac v a+\frac{v-w}{a}+\frac{d-(加速路程+减速路程)}v ,分别表示加速的时间,减速的时间和匀速行驶的时间

答案即为 t 1 + t 2 t_1+t_2

说白了就是一道物理题呀QwQ

时间复杂度? O ( 1 ) O(1)


C o d e Code

#include<cstdio>
#include<cmath>
using namespace std;
double a,v,l,d,w,t1,t2,ans;
inline double F(double x){return x*x;}
inline double f(double v0,double v,double a,double l) 
{
	double s=(v+v0)*(v-v0)/2/a;
	if(s>=l) return (-v0+sqrt(F(v0)+2*a*l))/a;
	else return (v-v0)/a+(l-s)/v;
}
signed main()
{
	scanf("%lf%lf%lf%lf%lf",&a,&v,&l,&d,&w);
	double stp=F(w)/2/a;
	if(w>=v||stp>=d) ans=f(0,v,a,l);
	else
	{
		t2=f(w,v,a,l-d);
		double tjs=sqrt((2*a*d+F(w))/2/a/a);
		if(tjs*a<=v) t1=2*tjs-w/a;
		else
		{
			double sf=F(v)/2/a;
			double sl=(v+w)*(v-w)/2/a;
			t1=v/a+(v-w)/a+(d-sf-sl)/v;
		}
		ans=t1+t2;
	}
	printf("%.12f",ans);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/89811207
今日推荐