[HDOJ 4969] Just a Joke [数学]

来源:互联网 发布:手机淘宝免费开店 编辑:程序博客网 时间:2024/05/17 09:02

这道题就推个公式就完了...

已知点1以速率v1做半径为R的圆周运动,另一点2有恒定速率v2,从圆心开始运动,且圆心和这两点一直在一条直线上,求点2与点一重合所需要的路程是否小于d。

点2的移动路径大概是个螺旋线的样子,不过我们可以用点2的移动时间来计算点2的移动路程。

把点2的移动速度分解为切向速度和法向速度,由于点1的移动速度和半径恒定不变,所以点2的切向角速度恒定不变。

可以得到方程w^2r(t)^2+vv(t)^2=v2^2,其中,w为角速度,r(t)为t时刻点2距圆心距离,vv(t)为t时刻的点2的法向速度。可以知道r(t)为vv(t)对t积分得到的结果。

于是可以得到下式:w^2F^2(x)+f^2(x)=v2^2。

可以解出(其实是猜出来的..这家伙长的比较像椭圆的参数方程...),F(x)=v2/w*sin(wx)。

将w=v1/R带入,解得r(t)=v2*R/v1*sin(v1/R*t)。

于是在r(t)==R时,可知t=arcsin(v1/v2)*r/v1。

但是在v1==0时要特判,因为那时v2/v1不存在,中间的推到过程不成立,直接计算可知t=R/v2。

#include <cstring>#include <cstdio>#include <iostream>#include <cmath>using namespace std;double const eps=1e-8;double v1,v2,r,d;double t;int T;int main(){scanf("%d",&T);while(T--){scanf("%lf%lf%lf%lf",&v1,&v2,&r,&d);if(v1==0) t=r/v2;double t=asin(v1/v2)*r/v1;if(t*v2<=d+eps) printf("Wake up to code\n");else printf("Why give up treatment\n");}return 0;}


0 0