1053:Accelerated Railgun
点p(px,py)から速度ベクトルvで打ち出されたレールガンが
原点にたどり着く距離を出力する問題。
原点にたどり着くには、一度も反射せずたどり着くか
反射してたどり着くしかない。
後者の場合は反射角が90度になっていなければならない。
cosθ= p・v / |p||v|
でcosを求め、
一度も反射しない場合 cosθ= -1
反射する場合 cosθ= 1
#include<cmath> #include<algorithm> #include<iostream> #include<vector> #include<climits> #include<cstdio> #include<cfloat> using namespace std; double EPS = 1e-10; struct point{ double x, y; }; double dot(point a, point b) { return (a.x * b.x + a.y * b.y); } double norm(point a){ return sqrt(a.x*a.x+a.y*a.y); } int main(void){ double D; point p,v; while(cin >> D,D){ cin >> p.x >> p.y >> v.x >> v.y; double d=D+1; double cos=dot(p,v)/norm(p)/norm(v); if(abs(1.0 + cos) < EPS )d=norm(p); else if(abs(1.0 - cos) < EPS)d=2.0-norm(p); if(d<D || abs(d-D)<EPS)printf("%.8f\n",d); else cout << "impossible" << endl; } return 0; }