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

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

AtCoder ABC 348 B - Farthest Point (6Q, 灰色, 200 点)

面白い探索問題

問題概要

座標平面上に  N 個の点がある。点  i の座標は  (X_{i}, Y_{i}) である。

 i = 1, 2, \dots, N に対して、点  i, j の距離が最大であるような  j の値を求めよ(タイがある場合は  j が最小のもの)。

制約

  •  2 \le N \le 100
  •  -1000 \le X_{i}, Y_{i} \le 1000

考えたこと

 i = 1, 2, \dots, N に対して、別々の問題を解く。

 j = 1, 2, \dots, N に対して

(X[i] - X[j]) * (X[i] - X[j]) + (Y[i] - Y[j]) * (Y[i] - Y[j])

の値(2 点  i, j 間の距離の平方)を求めて、それが最大となる  j を求めれば良い。

コード

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

int main() {
    int N;
    cin >> N;
    vector<int> X(N), Y(N);
    for (int i = 0; i < N; i++) cin >> X[i] >> Y[i];

    for (int i = 0; i < N; i++) {
        int max_distance = 0, max_index = -1;
        for (int j = 0; j < N; j++) {
            int dist = (X[i] - X[j]) * (X[i] - X[j]) + (Y[i] - Y[j]) * (Y[i] - Y[j]);
            if (max_distance < dist) {
                max_distance = dist;
                max_index = j;
            }
        }
        cout << max_index+1 << endl;
    }
}