平面上のP1257最も近い点
タイトル説明
距離平面内に所定のn点n個の点の全ての点が、距離は全ての点の最小となるように、その中のポイントのペアを見つけます。
入力形式
最初のライン:N;2≤n≤10000
次のn行:行ごとに2つの実数:XY、行座標を示し、列はスペースで区切られ、座標点。
出力フォーマット
唯一の行の後ろに小数点以下4桁まで正確実数、最短距離。
サンプル入力と出力
入力#1
3
1 1
1 2
2 2
出力#1
1.0000
説明/ヒント
この問題は、検索をバーストすることができます
[思考]
パーティション+列挙は、
ラベルは、パーティションの上になりますなぜ私にはわからないと言って
除算を使用して、それを高速に実行します征服する
が、この質問は完全に列挙の外にいたされた
ビット困難だった
が、あなたが作品を使用することができたら、彼は失っていたために
、それは、洪水の問題であり、
しかし、二注目すべき場所があります
minとmaxは2つのだけの同一の型指定された変数を比較することができます
定義せずに変数の2種類を比較する方法はありません
、彼はダブルサイズの2種類を比較できるような、あなたは、2つのint型のサイズを比較することができます
が、一度、二重を比較しますint型とコンパイルエラーの大き
あなたはdouble型にここで最小値Minを定義する必要がありますので、
sqrtの言葉内の式cmathライブラリが必要な場合は2点間の距離として
値を返すのdouble型である
フロートがああOKではありません!
精度の出力とは、ときに
もちろん、それは二重の方が良いです
別の顕著な問題は、2つのポイント間のルート式ということである
2点間の距離は、に等しい(\のSQRT { - (X_1 \ \ - X_2)^ 2 +(Y_1 Y_2)^ 2})
[完了コード】
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int Max = 10005;
struct node
{
int x,y;
}a[Max];
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;++ i)
scanf("%d%d",&a[i].x,&a[i].y);
double Min = 0x7fffffff;
for(int i = 1;i <= n;++ i)
for(int j = i + 1;j <= n;++ j)
Min = min(Min,sqrt((a[i].x -a[j].x) * (a[i].x - a[j].x) + (a[i].y - a[j].y) * (a[i].y - a[j].y)));
printf("%.4lf\n",Min);
return 0;
}