題解說的這麼複雜
個人理解:先排序,然後將\(n\)個點均分成左右兩部分,分別求出左邊點之間的最近距離\(d1\),和右邊點的最近距離\(d2\),取\(d=min(d1,d2)\)。然後考慮最近點隊的兩個點分屬於兩邊的情況,肯定只可能是很靠近中間線的那幾個點(題解裡證明不超過六個)。加個剪枝優化,橫座標距離\(s[mid].x\)(中點線)大於\(d\)的肯定不行。將所有據中點線距離不超過\(d\)的點取出,按\(y\) 值排個序,對於每乙個點,只需要考慮它後面(下面)的\(y\) 值據它不超過 \(d\) 的點,超過就可以\(break\)(因為排好序了嘛)。
#include#include#include#include#includeusing namespace std;
const int n = 1000005;
const int inf = 2<<20;
int n,temp[n];
struct points[n];
bool cmp(point a,point b)
return d;
}int main()
平面最近點對
求點集中的最近點對有以下兩種方法 設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對...
平面最近點對
求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...