C - 終電に間に合え! / Catch the Last Train! Editorial by admin
(非推奨) Claude 4.5 Opus概要
高橋君が全力ダッシュを最適に使って駅に到着する最短時間と、終電が駅に到着する時間を比較し、終電に間に合うかを判定する問題です。
考察
問題の整理
- 高橋君:座標 \(0\) から座標 \(G\) へ移動したい
- 終電:座標 \(M\) から座標 \(G\) へ速度 \(V\) で移動中
- 高橋君は通常速度 \(1\)、全力ダッシュで速度 \(D\)(最大 \(K\) 秒まで使用可能)
重要な気づき
終電の到着時刻は固定
終電は距離 \(M - G\) を速度 \(V\) で移動するので、到着時刻は: $\(\text{終電の到着時刻} = \frac{M - G}{V}\)$
高橋君の最短到着時間を求める
高橋君が距離 \(G\) を移動する最短時間を考えます。全力ダッシュを使うほど速く移動できるので、できるだけ多く全力ダッシュを使うのが最適です。
2つのケースに分けて考えます:
ケース1:全力ダッシュだけで到着できる場合(\(D \times K \geq G\))
全力ダッシュのみで距離 \(G\) を移動できます。 $\(\text{最短時間} = \frac{G}{D}\)$
ケース2:全力ダッシュだけでは足りない場合(\(D \times K < G\))
\(K\) 秒間全力ダッシュして \(D \times K\) 進み、残り \(G - D \times K\) を通常速度 \(1\) で進みます。 $\(\text{最短時間} = K + (G - D \times K)\)$
具体例
\(G = 100\), \(D = 3\), \(K = 10\) の場合: - 全力ダッシュで進める距離:\(3 \times 10 = 30\) - 残りの距離:\(100 - 30 = 70\) - 最短時間:\(10 + 70 = 80\) 秒
アルゴリズム
- 終電が駅に到着する時刻を計算:\(\text{train\_time} = \frac{M - G}{V}\)
- 高橋君が駅に到着する最短時間を計算:
- \(D \times K \geq G\) なら:\(\text{takahashi\_time} = \frac{G}{D}\)
- そうでなければ:\(\text{takahashi\_time} = K + (G - D \times K)\)
- \(\text{takahashi\_time} \leq \text{train\_time}\) なら
Yes、そうでなければNo
計算量
- 時間計算量: \(O(1)\)(四則演算のみ)
- 空間計算量: \(O(1)\)(変数のみ使用)
実装のポイント
オーバーフローに注意:\(D \times K\) の計算で、\(D\) と \(K\) がともに最大 \(10^9\) の場合、積は \(10^{18}\) になります。Python では整数のオーバーフローがないため問題ありませんが、他の言語では注意が必要です。
浮動小数点の比較:この問題では割り算の結果を比較しますが、入力が整数なので、不等式を変形して整数のまま比較することも可能です(より厳密な実装が必要な場合)。
全力ダッシュの最適な使い方:途中で休む理由がないため、「最初に全力ダッシュをすべて使い切る」という戦略が最適になります。
ソースコード
G, M, D, K, V = map(int, input().split())
# 終電が駅に到着する時刻
# 終電は座標Mから駅(座標G)へ向かう。距離は M - G
train_time = (M - G) / V
# 高橋君が駅に到着する最短時間
# 全力ダッシュをK秒使うと、その間は速度D、残りは速度1
# 全力ダッシュで進める距離: D * min(K, t) (t秒かけるとき、最大K秒まで全力ダッシュ可能)
# 通常移動で進める距離: 1 * max(0, t - K)
# 距離Gを移動するのに必要な最短時間を求める
# 全力ダッシュをk秒(k <= K)使うとする
# 全力ダッシュでD*k進み、残りG - D*kを通常速度1で進む
# 合計時間 = k + (G - D*k) = G - k*(D-1)
# もし全力ダッシュだけで到着できる場合(D*K >= G)
# 必要時間 = G / D (全力ダッシュのみ)
# より正確には、全力ダッシュをt秒すると距離D*tを移動
# G <= D*K なら、必要時間は G/D
if D * K >= G:
# 全力ダッシュだけで到着可能
takahashi_time = G / D
else:
# K秒全力ダッシュ + 残りを通常移動
# 全力ダッシュでD*K進み、残りG - D*Kを速度1で進む
takahashi_time = K + (G - D * K)
if takahashi_time <= train_time:
print("Yes")
else:
print("No")
この解説は claude4.5opus によって生成されました。
posted:
last update: