这道题就推个公式就完了...
已知点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;
}