AOJ 862 平面上最近點對

2021-07-31 08:36:27 字數 1545 閱讀 9901

time limit: 1000 ms   memory limit: 256 mb

total submission: 78   submission accepted: 8

judge by case

description

給定平面上n個點,找出其中的一對點的距離,使得這n個點的所有點對中,該距離為所有點對中最小的。

input

第一行:n;2≤n≤60000;

接下來n行:每行兩個整數:x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。

output

僅一行,乙個實數,表示最短距離,精確到小數點後面4位。

sample input

original

transformed

3

1 1

1 2

2 2

3[eol] 

1[sp]

[sp]1[eol] 

1[sp]

[sp]2[eol] 

2[sp]

[sp]2[eof]

sample output

original

transformed

1.0000
#include#include#include#include#include//#define debug

using namespace std;

const int maxn = 100000;

struct point a[maxn + 5], b[maxn + 5];

double val;

bool comp_x(point a, point b)

bool comp_y(point a, point b)

double dis(point a, point b)

double solve(int l, int r)

int mid = (l + r) / 2;

double disl = solve(l, mid);

double disr = solve(mid + 1, r);

val = min(disl, disr);

int k = 0;

for (int i = l; i <= r; i++)

} sort(b, b + k, comp_y);

for (int i = 0; i < k - 1; i++)

}else break;

} }return val;

}int main()

sort(a, a + n, comp_x);

printf("%.4lf\n", solve(0, n - 1));

#ifdef debug

printf("time:%.3lf\n", (double)(clock() - start) / clocks_per_sec);

#endif

return 0;

}

書上講解 平面上最近點對問題

給你二維平面上的n個點,讓你求出其中最近的點對。題解 這是乙個分治的問題。可以這樣做 首先將n個點按照x公升序排。然後將l.r這個區間內的點分成 l.mid和mid 1.r兩個部分遞迴求解。分別求出這兩段裡面的點的最近點對的距離d1和d2 然後令d min d1,d2 這是最後答案的點都在其中一邊的...

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...