TopCoder SRM 347 Div1 Easy Aircraft
問題
二機の飛行機が飛んでいる。
それぞれ、初期位置の座標が(p1[0],p1[1],p1[2]),(p2[0],p2[1],p2[2])で、
速度が(v1[0],v1[1],v1[2]),(v2[0],v2[1],v2[2])の等速直線運動をしている。
二台の飛行機が、T≧0において、半径R以下に接近することは起こるか。
起こるなら"YES"を、起こらないなら"NO"を返せ。
制約条件
-10000≦p1[i],p2[i]≦10000
0≦R≦10000
方針
二機の飛行機がT=0においてすでに距離R以下ならYES.
二機の飛行機が距離Rになる時間をtとすると、
tに関する二次方程式が得られる。
これがt≧0なる解を持てばYes,そうでなければNoである。
ソースコード
class Aircraft { public: string nearMiss(vector <int> p1, vector <int> v1, vector <int> p2, vector <int> v2, int R) { rep(i,3)p1[i]-=p2[i], v1[i]-=v2[i]; double vp=0,vv=0,pp=0; rep(i,3){ vp+=v1[i]*p1[i]; vv+=v1[i]*v1[i]; pp+=p1[i]*p1[i]; } double D=vp*vp-vv*(pp-R*R); if(pp<=R*R)return "YES"; if(D<0||vv==0||(-vp+sqrt(D))/vv<0)return "NO"; return "YES"; } };