結果

問題 No.229 線分上を往復する3つの動点の一致
ユーザー rpy3cpprpy3cpp
提出日時 2015-06-19 23:48:39
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,600 bytes
コンパイル時間 296 ms
コンパイル使用メモリ 10,832 KB
実行使用メモリ 9,836 KB
最終ジャッジ日時 2023-09-21 10:21:27
合計ジャッジ時間 3,313 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 RE -
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 RE -
testcase_25 RE -
testcase_26 RE -
testcase_27 RE -
testcase_28 RE -
testcase_29 RE -
testcase_30 RE -
testcase_31 RE -
testcase_32 RE -
testcase_33 RE -
testcase_34 RE -
testcase_35 RE -
testcase_36 RE -
testcase_37 RE -
testcase_38 RE -
testcase_39 RE -
testcase_40 RE -
testcase_41 RE -
testcase_42 RE -
testcase_43 RE -
testcase_44 RE -
testcase_45 RE -
権限があれば一括ダウンロードができます

ソースコード

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