A - 訓練メニューの消化 / Completing the Training Menu 解説 by admin
Gemini 3.0 Flash (Thinking)概要
\(N\) 種類のエクササイズがあり、それぞれ \(A_i\) 回分行えます。1回のトレーニングでいずれか1つのエクササイズを \(K\) 回分消化するとき、合計 \(M\) 回のトレーニングが可能かどうかを判定する問題です。
考察
この問題のポイントは、「各エクササイズが最大で何回のトレーニングに貢献できるか」を独立に考えられる点です。
あるエクササイズ \(i\) の残り回数が \(A_i\) であるとき、1回のトレーニングで \(K\) 回分を消費します。このエクササイズから最大で何回のトレーニングを行えるかを考えると、以下のようになります。 - \(A_i < K\) のとき: 0回 - \(A_i \geq K\) のとき: \(\lfloor A_i / K \rfloor\) 回(\(A_i\) を \(K\) で割った商)
例えば、\(A_i = 10, K = 3\) の場合、このエクササイズを使って \(10 \div 3 = 3\) 余り \(1\) となるため、最大 3 回のトレーニングが可能です。余った 1 回分は \(K\) 未満であるため、他のトレーニングに回すことはできません。
高橋君が合計 \(M\) 回のトレーニングを行いたい場合、すべての種類のエクササイズから得られる「可能なトレーニング回数」の合計が \(M\) 以上であれば、目標を達成できることになります。
アルゴリズム
- 合計可能回数を保持する変数
total_possible_sessionsを \(0\) で初期化します。 - 各エクササイズ \(i = 1, 2, \ldots, N\) について以下を繰り返します:
- \(A_i\) を \(K\) で割った商(切り捨て)を計算し、
total_possible_sessionsに加算します。
- \(A_i\) を \(K\) で割った商(切り捨て)を計算し、
- 最終的な
total_possible_sessionsが \(M\) 以上であればYesを、そうでなければNoを出力します。
計算量
- 時間計算量: \(O(N)\)
- エクササイズの数 \(N\) に対して 1 回ずつループを回して計算を行うため、線形時間で処理が完了します。
- 空間計算量: \(O(N)\)
- 入力された \(A_i\) をリスト等に保持する場合に \(O(N)\) 必要です。入力を 1 つずつ読み込んで処理する場合は \(O(1)\) に抑えることも可能です。
実装のポイント
大きな数値への対応: \(M, K, A_i\) の値は最大 \(10^9\) と非常に大きくなりますが、Python などの言語では標準で多倍長整数が扱えるため、オーバーフローを気にせず計算できます。
整数の割り算: \(A_i / K\) の計算では、小数点以下を切り捨てた整数値(商)を求める必要があります。Python では
//演算子を使うことで簡潔に記述できます。ソースコード
import sys
def solve():
# 標準入力からすべてのデータを読み込み、空白文字で分割します
input_data = sys.stdin.read().split()
if not input_data:
return
# 1行目の N, M, K を取得します
# N: エクササイズの種類数
# M: トレーニングを行いたい日数
# K: 1回のトレーニングで減る回数
n = int(input_data[0])
m = int(input_data[1])
k = int(input_data[2])
# 2行目の A_1, A_2, ..., A_N を順番に処理します
# 各エクササイズ i について、最大で floor(A_i / K) 回のトレーニングが可能です
total_possible_sessions = 0
for i in range(n):
# A_i は input_data のインデックス 3 以降に格納されています
a_i = int(input_data[3 + i])
total_possible_sessions += a_i // k
# 合計の可能回数が M 回以上であれば、M 日間トレーニングを続けることができます
if total_possible_sessions >= m:
print("Yes")
else:
print("No")
if __name__ == "__main__":
solve()
この解説は gemini-3-flash-thinking によって生成されました。
投稿日時:
最終更新: