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

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

AtCoder ABC 057 B - Checkpoints (6Q, 茶色, 200 点)

多重 for 文の練習問題!

問題概要

二次元平面上に  N 人の学生と、 M 個のチェックポイントがある。学生  i は座標  (a_{i}, b_{i}) にいて、チェックポイント  j は座標  (c_{j}, d_{j}) にいる。

各学生について、その学生からマンハッタン距離が最も近いチェックポイントを求めよ (タイがある場合は番号の最も小さいものを答えよ)。

制約

  •  1 \le N, M \le 50

考えたこと

各学生について求めたいという問題。全体としては次のように書けば良い。

for (int i = 0; i < N; i++) {
    // 学生 i についての答えを求める

}

学生 i についての答えを求める部分については、再び for 文を活用できる。全体としては二重の for 文となる。

コード

#include <bits/stdc++.h>
using namespace std;
const long long INF = 1LL<<60;

int main() {
    int N, M;
    cin >> N >> M;
    vector<long long> a(N), b(N), c(M), d(M);
    for (int i = 0; i < N; i++) cin >> a[i] >> b[i];
    for (int j = 0; j < M; j++) cin >> c[j] >> d[j];

    for (int i = 0; i < N; i++) {
        // 学生 i についての答えを求める
        long long min_distance = INF;
        int res = -1;
        for (int j = 0; j < M; j++) {
            long long dist = abs(a[i] - c[j]) + abs(b[i] - d[j]);
            if (min_distance > dist) {
                min_distance = dist;
                res = j;
            }
        }
        cout << res+1 << endl;
    }
}