結果

問題 No.229 線分上を往復する3つの動点の一致
ユーザー rpy3cpp
提出日時 2015-06-19 23:48:39
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,600 bytes
コンパイル時間 95 ms
コンパイル使用メモリ 12,416 KB
実行使用メモリ 11,264 KB
最終ジャッジ日時 2024-07-07 04:28:04
合計ジャッジ時間 2,637 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 3
other RE * 43
権限があれば一括ダウンロードができます

ソースコード

diff #

from fractions import gcd
from fractions import Fraction as frac

t1 = int(input())
t2 = int(input())
t3 = int(input())

def solve(t1, t2, t3):
    '''
    p1 と p2 が 時刻 t に重なるとすると、
    t/t1 + t/t2 = m (向き合ってp1とp2が出会う)
    t/t1 - t/t2 = n (同じ向きでp1がp2を追い抜く)
    のどちらかが成り立つ。
    p1 と p3 も 時刻 t に重なるとすると、
    t/t1 + t/t3 = k
    t/t1 - t/t3 = l
    のどちらかが成り立つ。
    これらの組み合わせ4通りについて、最小の t を求め、それら4つの中で一番小さい t を選べばよい。

    t/t1 + t/t2 = m and t/t1 + t/t3 = k の場合を考える。
    t = m/(1/t1+1/t2) = m*t1*t2/(t1+t2)
    t = k/(1/t1+1/t3) = k*t1*t3/(t1+t3)
    よって、m*t1*t2/(t1+t2) = k*t1*t3/(t1+t3)
    変形すると、
    m/k = (t1*t3/(t1+t3)) / (t1*t2/(t1+t2)) = [t3*(t1+t2)]/[t2*(t1+t3)] 式(1)
    最小の t は、式(1)を満たす最小の m を t = m*t1*t2/(t1+t2) に代入して求めればよい。
    最小の m は、式(1)を通分すれば得られる。
    
    '''
    M = t3 * (t2 + t1)
    N = t3 * (t2 - t1)
    K = t2 * (t3 + t1)
    L = t2 * (t3 - t1)
    cpp = gcd(M, K)
    cpm = gcd(M, L)
    cmp = gcd(N, K)
    cmm = gcd(N, L)
    tpp = frac(M * t1 * t2 // cpp, t2 + t1)
    tpm = frac(M * t1 * t2 // cpm, t2 + t1)
    tmp = frac(N * t1 * t2 // cmp, t2 - t1)
    tmm = frac(N * t1 * t2 // cmm, t2 - t1)
    
    t_min = min(tpp, tpm, tmp, tmm)
    
    print('{}/{}'.format(t_min.numerator, t_min.denominator))

solve(t1, t2, t3)
0