【競プロ精進ログ】APG4b編<2-2>

zuka

ついに競技プログラミングを始めました!

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために積極的に,アウトプットしていく作戦です。これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderが公表しているc++の入門記事の内容を1からさらっていくものです。今回は2.02.多重ループです。

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;

int main() {
  int N, S;
  int ans = 0;
  cin >> N >> S;
  vector<int> A(N), P(N);
  rep(i, N){
    cin >> A[i];
  }
  rep(i, N){
    cin >> P[i];
  }

  // for文を2つ重ねる
  rep(i, N){
    rep(j, N){
      if (A[i] + P[j] == S){
        ans ++;
      }
    }
  }
  cout << ans << endl;
}

ポイント

今回おさえるべき内容

 for文の中にfor文を入れることができる

 外側のループを抜けたい場合にはフラグを用意する

 各ループで使われている変数ijを間違えないように

for文の中にfor文を入れることで多重に繰り返しを行うことができます。1つのループであればbreakを使えば抜け出せたのですが,2つ以上のループでbreakを使ってしまうと,本来意図しない位置でforループを抜け出してしまいます。

そこで,あらかじめflag変数を用意しておいて,flagtrueになればforループを抜け出すというような処理を行うことが一般的です。

#define rep(i, n) for (int i = 0; i < (int)(n); i++)

bool flag = false;
rep(i, N){
  rep(j, M){
    行いたい処理
    flagがtrueになるか判断してtrueならばflagにtrueを代入
  }
  // もしflagがtrueならば外側のループを抜け出す
  // ここで闇雲にbreakだけを記述してしまうと外側のループは最初で抜け出してしまう
  if (flag==true) break;
}
よかったらシェアしてね!

コメント

コメントする

目次
閉じる