はまやんはまやんはまやん

hamayanhamayan's blog

: (Colon) [AtCoder Beginner Contest 168 C]

https://atcoder.jp/contests/abc168/tasks/abc168_c

前提知識

解説

https://atcoder.jp/contests/abc168/submissions/13349960

ちょっとした幾何知識が必要。
余弦定理が想定解っぽいが、自分は回転を使って解いた。

固定する定点の座標を(0,0)とおくと、時針の先端は(0,A), 分針の先端は(0,B)のように表現できる。
H時間M分後の座標を考えてみると、
 時針→時計回りに360×(H60+M)/(1260)
分針→時計回りに360×M/60
回転していることになる。
座標の回転はsin,cosで行えるので、適切にradianに変換して、座標を計算できる。
あとは、2つの座標の距離を計算すると答え。

int A, B, H, M;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> A >> B >> H >> M;

    P hour(0, A);
    P minute(0, B);

    double p;

    p = 1.0 * (H * 60 + M) / (12 * 60);
    hour = rotate(hour, 2 * PI * (1 - p));

    p = 1.0 * M / 60;
    minute = rotate(minute, 2 * PI * (1 - p));

    double ans = abs(hour - minute);
    printf("%.15f\n", ans);
}