Codeforces 44 D. Hyperdrive
問題
3次元空間にn個の惑星があり、
1番の惑星から宇宙船が飛び立つ。
宇宙船は以下のような動きをする。
- 惑星から、他の全ての惑星に向かって一直線にn個の宇宙船が飛びたつ
- 他の惑星に着陸すると同時に他のn-2個の惑星に向かって宇宙船が飛び立つ
- 更にそれが他の惑星に着陸したら同様に動く
このとき、宇宙船二つが最初に衝突するまでにかかる時間を求めよ。
宇宙船は等速直線運動するものとする。
制約条件
n≦5000
方針
宇宙船が正面衝突するというのは、
1番の惑星とi番の惑星とj番の惑星を結ぶ三角形ができるということで、
最初に衝突するのは、宇宙船が周の一番短い三角形を飛ぶ時間の半分に等しい。
n≦5000なので、1番の惑星を含む三角形は全列挙できる。
ソースコード
double d3(int x,int y,int z){ return sqrt(x*x+y*y+z*z*1.0); } void run() { int n; cin>>n; vi x(n),y(n),z(n); rep(i,n)cin>>x[i]>>y[i]>>z[i]; rep(i,n-1)x[i+1]-=x[0], y[i+1]-=y[0], z[i+1]-=z[0]; double ans=INF; for(int i=1;i<n;i++)for(int j=i+1;j<n;j++)ans=min(ans, d3(x[i],y[i],z[i])+d3(x[j],y[j],z[j])+d3(x[i]-x[j],y[i]-y[j],z[i]-z[j])); printf("%.9f\n",ans/2); }