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";
	}
};