A - 中古車の選定 / Used Car Selection Editorial by admin Editorial for printing
Gemini 3.0 Flash概要
\(N\) 台の中古車の中から、与えられた価格の範囲(\(L\) 以上 \(R\) 以下)と走行距離の上限(\(M\) 以下)の両方の条件を満たす車の台数を数える問題です。
考察
この問題で重要なのは、各車が「候補車」であるかどうかを判定するための条件を正確に整理することです。
- 価格の条件: \(L \leq P_i \leq R\)
- 走行距離の条件: \(K_i \leq M\)
これら 2つの条件を同時に満たす 車をカウントします。
制約を確認すると、車の台数 \(N\) は最大で \(10^5\) です。1台ずつ順番に条件を満たしているか確認していく素朴な方法(線形探索)をとった場合、計算回数は \(10^5\) 回程度になります。一般的なプログラミング競技の制限時間(1〜2秒)では、\(10^7 \sim 10^8\) 回程度の計算が可能であるため、このアプローチで十分に間に合います。
特別なアルゴリズムやデータ構造を導入する必要はなく、ループ(for文)と条件分岐(if文)を用いたシンプルな実装で解くことができます。
アルゴリズム
以下の手順で解を進めます。
- 入力から \(N, L, R, M\) を受け取る。
- 「候補車」の台数を記録する変数
candidate_countを \(0\) で初期化する。 - \(N\) 台の車について、以下の処理を繰り返す:
- \(i\) 番目の車の価格 \(P_i\) と走行距離 \(K_i\) を受け取る。
- もし \(L \leq P_i\) かつ \(P_i \leq R\)、かつ \(K_i \leq M\) であれば、
candidate_countを \(1\) 増やす。
- 最終的な
candidate_countの値を出力する。
計算量
- 時間計算量: \(O(N)\)
- \(N\) 台の車に対してそれぞれ 1 回ずつ判定を行うため、台数に比例した時間がかかります。
- 空間計算量: \(O(N)\)
- 提供されたコードでは
sys.stdin.read().split()を使用して全ての入力を一度にリストとして保持しているため、入力の大きさに比例したメモリを消費します。 - (1行ずつ読み込んで処理する場合は \(O(1)\) に抑えることも可能です。)
- 提供されたコードでは
実装のポイント
効率的な入力: \(N\) が \(10^5\) と比較的大きいため、Pythonで
input()を繰り返すと実行時間が長くなる場合があります。sys.stdin.read().split()を使って一括で読み込むことで、高速に入力を処理できます。比較演算子の連結: Pythonでは
L <= P <= Rのように比較演算子を連結して書くことができます。これにより、条件式を簡潔に記述できます。ソースコード
import sys
def solve():
# 全ての入力を一度に読み込み、空白で分割します
input_data = sys.stdin.read().split()
if not input_data:
return
# 最初の4つの値(N, L, R, M)を取得します
N = int(input_data[0])
L = int(input_data[1])
R = int(input_data[2])
M = int(input_data[3])
candidate_count = 0
# 各車の情報をループで確認します
# 車の情報はインデックス 4 以降に 2 つずつ格納されています
for i in range(N):
P = int(input_data[4 + 2 * i])
K = int(input_data[5 + 2 * i])
# 条件:価格が L 以上 R 以下、かつ走行距離が M 以下
if L <= P <= R and K <= M:
candidate_count += 1
# 結果を出力します
print(candidate_count)
if __name__ == '__main__':
solve()
この解説は gemini-3-flash-preview によって生成されました。
posted:
last update: