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
31 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對...