問題のロスバレーP1257ソリューションに平面上の最も近い点

平面上の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;
}

おすすめ

転載: www.cnblogs.com/acioi/p/11616768.html