Official

C - 終電に間に合え! / Catch the Last Train! Editorial by admin

(非推奨) Qwen3-Coder-480B

概要

高橋君が終電に間に合うかどうかを判定する問題です。高橋君は限られた時間だけ「全力ダッシュ」ができ、それ以外は通常速度で移動します。終電が駅に到着する前に高橋君が到着できれば Yes、そうでなければ No を出力します。

考察

この問題では、高橋君が最適に全力ダッシュを使うことで最も速く駅に到着する時間を求め、それが終電の到着時刻以下であるかを判定する必要があります。

重要な観察

  • 高橋君の移動時間は、全力ダッシュを使う秒数 \(k\) によって変わります。
  • 最も早く駅にたどり着くには、全力ダッシュを最大限使うのが最適です。
  • 全力ダッシュの効果は非常に大きく(最大 \(D\) 倍)、限界時間 \(K\) 秒まで使えるので、ダッシュだけで到着できるならそれを使うべきです。

素朴なアプローチでは?

例えば、全力ダッシュを使う秒数を全探索するような方法では、\(K\)\(10^9\) オーダーなので TLE になってしまいます。そのため、数学的に直接求める必要があります。

解決方法

高橋君が最短で駅に到着する時間 \(T_{\text{takahashi}}\) は次のように求められます:

  • もし \(K \geq G\) なら、全部ダッシュで到着可能: $\( T_{\text{takahashi}} = \frac{G}{D} \)$

  • そうでない場合:

    • 最大 \(K\) 秒を全力ダッシュで移動 → 距離 \(K \cdot D\)
    • 残り距離 \(G - K \cdot D\) を通常速度で移動(1秒/1距離)→ 時間 \(G - K \cdot D\)

ただし、ダッシュだけで到着できる場合(\(K \cdot D \geq G\))は、やはり: $\( T_{\text{takahashi}} = \frac{G}{D} \)$

また、終電が駅に到着する時間は: $\( T_{\text{train}} = \frac{M - G}{V} \)$

最終的に \(T_{\text{takahashi}} \leq T_{\text{train}}\) を判定すれば答えが出せます。

入力例:

G=10, M=30, D=3, K=2, V=2
  • 終電の到着時刻:\((30 - 10)/2 = 10\)
  • 高橋君は2秒間ダッシュで \(2 \times 3 = 6\)、残り4を歩くので合計時間は \(2 + 4 = 6\)
  • \(6 \leq 10\) なので Yes

アルゴリズム

  1. 終電の駅到着時間を計算:
    $\( T_{\text{train}} = \frac{M - G}{V} \)$
  2. 高橋君の最短到着時間を計算:
    • \(K \geq G\) なら \(T_{\text{takahashi}} = G/D\)
    • それ以外:
      • ダッシュ距離が \(G\) 以上なら同様に \(G/D\)
      • それ以外は \(K + (G - K \cdot D)\)
  3. \(T_{\text{takahashi}} \leq T_{\text{train}}\) なら Yes、そうでなければ No

計算量

  • 時間計算量: \(O(1)\)
  • 空間計算量: \(O(1)\)

実装のポイント

  • 浮動小数点数を使う際は、比較時に誤差に注意が必要ですが、今回は大小比較のみで十分な精度を持つので問題ありません。
  • K >= G のケースを最初に処理することで、後の計算をシンプルにできます。
  • ダッシュだけで到着できるケースを忘れずに確認しましょう。
## ソースコード

```python
G, M, D, K, V = map(int, input().split())

# 終電が駅に到着する時間
T_train = (M - G) / V

# 高橋君が全力ダッシュをすべて使い切っても到着できるか?
# 全力ダッシュをK秒間使い、残り(G - K)秒を通常速度で進む場合の時間
# ただし、KがGより大きい場合は、全部ダッシュでG秒で到着可能
if K >= G:
    # 全部ダッシュで到着可能
    T_takahashi = G / D
else:
    # K秒ダッシュ + (G - K)秒通常速度
    distance_dashed = K * D
    if distance_dashed >= G:
        # ダッシュだけで到着可能
        T_takahashi = G / D
    else:
        # ダッシュ + 通常速度
        T_takahashi = K + (G - K * D)

# 高橋君が終電に間に合う条件:T_takahashi <= T_train
if T_takahashi <= T_train:
    print("Yes")
else:
    print("No")

この解説は qwen3-coder-480b によって生成されました。

posted:
last update: