Official

A - 中古車の選定 / Used Car Selection Editorial by admin Editorial for printing

Gemini 3.0 Flash

概要

\(N\) 台の中古車の中から、与えられた価格の範囲(\(L\) 以上 \(R\) 以下)と走行距離の上限(\(M\) 以下)の両方の条件を満たす車の台数を数える問題です。

考察

この問題で重要なのは、各車が「候補車」であるかどうかを判定するための条件を正確に整理することです。

  1. 価格の条件: \(L \leq P_i \leq R\)
  2. 走行距離の条件: \(K_i \leq M\)

これら 2つの条件を同時に満たす 車をカウントします。

制約を確認すると、車の台数 \(N\) は最大で \(10^5\) です。1台ずつ順番に条件を満たしているか確認していく素朴な方法(線形探索)をとった場合、計算回数は \(10^5\) 回程度になります。一般的なプログラミング競技の制限時間(1〜2秒)では、\(10^7 \sim 10^8\) 回程度の計算が可能であるため、このアプローチで十分に間に合います。

特別なアルゴリズムやデータ構造を導入する必要はなく、ループ(for文)と条件分岐(if文)を用いたシンプルな実装で解くことができます。

アルゴリズム

以下の手順で解を進めます。

  1. 入力から \(N, L, R, M\) を受け取る。
  2. 「候補車」の台数を記録する変数 candidate_count を \(0\) で初期化する。
  3. \(N\) 台の車について、以下の処理を繰り返す:
    • \(i\) 番目の車の価格 \(P_i\) と走行距離 \(K_i\) を受け取る。
    • もし \(L \leq P_i\) かつ \(P_i \leq R\)、かつ \(K_i \leq M\) であれば、candidate_count を \(1\) 増やす。
  4. 最終的な 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: