yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

AtCoder Beginner Contest 234 B - Longest Segment

問題の要約
 二次元平面上にN個の点がある。i個目の点の座標は(xi,yi)である。
 この中から2個の点を選ぶとき、それらを結ぶ線分の長さの最大値を求めよ。
制約
 2<=N<=100
 -1000<=xi,yi<=1000
 (xi,yi)≠(xj,yj)(i≠j)
入力
 N
 x1 y1
 ...
 xN yN
出力
 想定解との絶対誤差または相対誤差が10^-6以下であれば正解とみなされる。
考え方
 1,2点間の線分の長さはx=x1-x2,y=y1-y2とすると、√(x*x+y*y)となる。
 2,Nの制約から全探索しても間に合う。
 3,出力の際には誤差に気を付ける。

実際のプログラム
#include<iostream>
#include<vector>
#include<map>
#include<cmath>
#include<iomanip>

using namespace std;

double distance(pair<double,double> xy1, pair<double,double> xy2){
  double x = xy1.first-xy2.first;
  double y = xy1.second-xy2.second;
  return sqrt(x*x+y*y);
}

int main(){
  int N;
  cin >> N;
  vector<pair<double,double>> xy(N);
  for(int i = 0; i < N; i++){
    cin >> xy[i].first >> xy[i].second;
  }
  double max_distance = 0;
  for(int i = 0; i < N; i++){
    for(int j = i+1; j < N; j++){
      double d = distance(xy[i],xy[j]);
      max_distance = max(max_distance, d);
    }
  }
  
  cout << setprecision(12) << max_distance << endl;
  
  return 0;
}