[AtCoder] ABC 183 B – Billiards

2020年12月12日

問題

方針

点 \( (S_x, S_y) \) と 点 \( (x, 0) \) を通る直線の傾きを \( a_1\) とし、点 \( (G_x, G_y) \) と 点 \( (x, 0) \) を を通る直線の傾きを \( a_2\) とすると、

\begin{eqnarray}
a_1&=& \dfrac{S_y}{S_x – x}\\\
a_2 &=& \dfrac{G_y}{G_x – x}\
\end{eqnarray}

となります。入射角と反射角が等しいことから、\( a_1 = -a_2 \) となることが分かります。したがって、

\begin{eqnarray}
a_1&=& -a_2 \\
\dfrac{S_y}{S_x – x} &=& -\dfrac{G_y}{G_x – x}\\
x &=& \dfrac{S_xG_y + S_yG_x}{S_y + G_y}
\end{eqnarray}

となります。

コード

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    double sx, sy, gx, gy;
    cin >> sx >> sy >> gx >> gy;
    double x = (sy * gx + sx * gy) / (sy + gy);
    printf("%.8f\n", x);
    return 0;
}