Official

B - Multi Test Cases Editorial by Nyaan


この問題のように、 1 つの入力に複数のテストケースが含まれるような入力は マルチテストケース と呼ばれます。
マルチテストケースは、1 つの入力にたくさんのテストケースを入れることで、テストケース自体の量を増やしたり入力ファイル数を減らす目的で主に利用されます。

マルチテストケースの問題で要求される実装は通常の問題とほとんど変わりません。唯一違う点は、普通は \(1\) 回だけ問題を解く処理を行うところを、\(T\) 回 問題を解く処理を行うコードに変える必要があるところです。これは for 文を利用すれば以下のように実装できます。

int main() {
  int T;
  cin >> T;
  for(int t = 0; t < T; t++) {
    // ここで問題を解く
  }
}

また、上の書き方ではスコープ(波括弧で区切られた部分)の入れ子が深くなって読みづらいと感じる方もいると思います。そのような方には、別案として次のコードのように解答部分を関数として切り分けた実装をお勧めします。

void solve() {
  // ここで問題を解く
}

int main() {
  int T;
  cin >> T;
  for(int t = 0; t < T; t++) solve();
}

以上のようなコードを書いた後に、通常の問題と同様のコードをコメント部分に書いていけばよいです。

次に、各テストケースごとに問題を解く部分を説明します。これは for 文を利用すれば解くことができます。具体的には、以下の手続きを実装すればよいです。

  • \(N\) を入力から受け取る。
  • 答えに相当する変数 \(\mathrm{ans}\) を用意する。\(\mathrm{ans}\) ははじめ \(0\) である。
  • \(N\) 個の整数を for 文などを利用してで入力から受け取る。各整数について、読み取った数が奇数, すなわち 2 で割り切れない数ならば \(\mathrm{ans}\)\(1\) を加える。
  • 最終的な \(\mathrm{ans}\) の値が答えとなる。

時間計算量は \(\mathrm{O}(N)\) です。1 つの入力あたりの時間計算量は \(\mathrm{O}(TN)\) になり、これは十分高速です。

posted:
last update: