結果

問題 No.229 線分上を往復する3つの動点の一致
ユーザー kimiyukikimiyuki
提出日時 2016-11-22 18:27:34
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
WA  
実行時間 -
コード長 1,344 bytes
コンパイル時間 71 ms
コンパイル使用メモリ 12,800 KB
実行使用メモリ 11,648 KB
最終ジャッジ日時 2024-05-05 12:21:15
合計ジャッジ時間 11,478 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

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

ソースコード

diff #

#!/usr/bin/env python3
from fractions import Fraction
from collections import defaultdict
import math
def lcm(a, b):
    return a * b // math.gcd(a, b)
def qlcm(p, q):
    a = p.numerator * q.denominator
    b = p.denominator * q.numerator
    c = p.denominator * q.denominator
    return Fraction(lcm(a, b), c)
def dir(v, t):
    x = v * t % 2
    return x < 1
def pos(v, t):
    x = v * t % 2
    return min(x, 2 - x)
t1 = int(input())
t2 = int(input())
t3 = int(input())
v1 = Fraction(2, t1)
v2 = Fraction(2, t2)
v3 = Fraction(2, t3)
t12 = lcm(t1, t2)
t = Fraction(0)
x = pos(v1, t)
ans = float('inf')
while t == 0 or x != 0:
    # update t
    d1 = dir(v1, t)
    d2 = dir(v2, t)
    if d1 == d2 == True: # right
        l = 2 * (1 - x)
    elif d1 == d2 == False: # left
        l = 2 * x
    else:
        l = 2
    t += l / (v1 + v2)
    x = pos(v1, t)
    # check P3
    y = pos(v3, t)
    for is_right in range(2):
        if is_right == x < y:
            dy = x + 1 + y
        else:
            dy = abs(x - y)
        dt = dy / v3
        if dt == 0 or (t12 - t3) % dt == 0:
            if dt == 0:
                k = 0
            else:
                k = (t12 - t3) / dt
            # print(t + t12 * k,  t + dt + t3 * k, k)
            if t + t12 * k == t + dt + t3 * k:
                ans = min(ans, t + t12 * k)
print(ans)
0