けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 一次予選 2024 (第 4 回) D - 差 (7Q, 難易度 3)

二重の for 文に慣れよう!

問題概要

長さが  N の数列  A_{1}, A_{2}, \dots, A_{N} と、長さが  M の数列  B_{1}, B_{2}, \dots, B_{M} が与えられる。

 A_{p} + K = B_{q}

を満たすような組  (p, q) ( 1 \le p \le N,  1 \le q \le M) の個数を求めよ。

制約

  •  1 \le N, M, K, A_{i}, B_{i} \le 100

考えたこと

この問題に限らず、2 つの数列からそれぞれ要素  (A_{p}, B_{q}) をとってきて、それが条件を満たすかどうかを調べていく処理は、次のように二重の for 文で書けます。

for (int p = 0; p < N; ++p) {
    for (int q = 0; q < M; ++q) {
        // A[p] と B[q] について調べる

    }
}

今回の問題も、同様の二重の for 文で解けます。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int K, N, M;
    cin >> K >> N;
    vector<int> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];
    cin >> M;
    vector<int> B(M);
    for (int i = 0; i < M; ++i) cin >> B[i];
    
    int res = 0;
    for (int p = 0; p < N; ++p) {
        for (int q = 0; q < M; ++q) {
            if (A[p] + K == B[q]) ++res;
        }
    }
    cout << res << endl;
}