Official

C - Farthest Point Editorial by MtSaka


この問題ではすべての点の組についてその距離を求めて、それぞれの点からの距離の最大値とその最大値を達成する番号が最小の点を求めることが問われています。

2点間のユークリッド距離を求めるのは、問題文にある式通りに計算することで行えます。ただし、ユークリッド距離の大小とユークリッド距離の \(2\) 乗の大小は変わらないので、この問題ではユークリッド距離の \(2\) 乗を管理することでが整数のみでの実装が可能です。

距離の最大値を達成する番号が最小の点を求めるには、例えば、番号が小さい順に見て行って最大値が更新されたら点の番号も更新するというような方法で行うことができます。

詳しくは実装例を参考にしてください。

実装例(C++):

#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_dist = 0; //距離の2乗の最大値
    int idx = -1;     //距離が最大になる点の番号(0-indexed)
    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]); // 点i,jの距離の2乗
      if (max_dist < dist) {
        // 距離の最大値が更新された場合
        max_dist = dist;
        idx = j;
      }
    }
    cout << idx + 1 << endl;
  }
}

posted:
last update: