Save the Energy 問題作成:泉 解答作成:荒木、村主 英訳:泉 解説:荒木 問題の説明 • 三次元空間に直線が何本 かある。 • 直線上はエネルギー0で動 ける。 • 直線間を動くためには、移 動距離分だけエネルギー が必要。 • startからgoalまで移動する のに必要なエネルギーの 最小値を求める。 – startとgoalは必ず直線上に ある。 z start y goal 0 x 解法 • 各直線間の最短距離を求めて、それを枝の 長さとする無向グラフ(今回は完全グラフ)を 作り、ダイクストラのアルゴリズムで求める。 – 今回は完全グラフなので – (疎なグラフの場合は ) • E…枝の数、V…点の数 • 問題なのは、各直線間の最短距離の求め方。 直線間の最短距離の求め方① • ベクトルを使って求める方 法。 http://oshiete1.goo.ne.jp/k otaeru.php3?q=77895 よ り。 • ~^は単位ベクトル • ~_はベクトル • Aaは直線Aとxy平面との交 点 • Bbは直線Bとxy平面との交 点 B z A b^ a^ y Bb Aa 0 求める距離dと それに平行な単 位ベクトルn^ c_ α β x • n^⊥a^,n^⊥b^ • n^=a^×b^/|a^×b^| (×は外積) • αa^+dn^=c_+βy^ • よってαa^n^+dn^n^ =c_n^+βb^n^ • ∴d=c_n^ B z A b^ a^ y Bb Aa 0 求める距離dと それに平行な単 位ベクトルn^ c_ α β x • ただし、AとBが平行の 時はn^を a^×b^/|a^×b^|として 求めることができない。 • そのような場合は、A上 の一点とBとの距離とし て求める。平行なので、 A上の一点はどこでも 良い。 p A x_ d B q y^ 適当な二点p,qについて、 上図のようにベクトルx_と 単位ベクトルy^をとると、 平行四辺形の面積 =垂線の長さd =|x_×y^| 直線間の最短距離の求め方② • 微分を使う方法 • (x1,y1,z1)+t(dx,dy,dz)と (x2,y2,z2)との距離を求 める • その距離をtについて微 分し、それが0となるtを 求める。 B z (x3,y3,z3) A (x1,y1,z1) (ex,ey,ez) (dx,dy,dz) y (x2,y2,z2) 0 x • (x2,y2,z2)= (x3,y3,z3)+s(ex,ey,ez) を先ほど求めた距離の 式(tは微分=0のものを代 入)に代入し、sについて 微分し、それが0となるs を求める。 • 求めたsから距離を求め る。 B z (x3,y3,z3) A (x1,y1,z1) (ex,ey,ez) (dx,dy,dz) y (x2,y2,z2) 0 • 微分を使う方法でも、平行の場合は点と直線 との距離で求めないといけない(∵二回目の微 分が0となるsが無数にあるから)。 • 式が非常に複雑になるので、ベクトルを使う 方がよいと思われる。 結果 • Submit:7 • Accept:4(first accept 64min) • ちなみに僕の予想はAccept:3でした。 余談 • コンテスト開始直前に、ジャッジプログラムの 一つが-O2オプションをつけるとおかしくなる ことが判明し、ゴタゴタしました。すいません。
© Copyright 2024 ExpyDoc