最近點對模板 hdu1007

2021-08-29 16:30:09 字數 873 閱讀 5354

題意:給你一堆點讓你求最近兩點之間距離的一半,如果用暴力的話o(n*n)明顯會超時,那麼我們就用分治思想,將所有點按照橫座標x排序,然後取中間的mid,分著求1-mid,mid-n,這樣遞迴求解,遞迴只需要logn級別就可以完成遞迴,這有點類似二分思想。

1.我們取左邊點對最小和右邊點對最小比較,取最小的,記做d

2:但是最近點有可能乙個點在左邊,乙個點在右邊,所以要單獨考慮。

3:我們for迴圈遍歷left->right的每個點,取出其中橫座標滿足到中間mid這個點橫座標之差小於d的點,因為求距離還有將y算上,如果你x都大於d了,就不可能距離小於d

4:但是如果滿足這樣的點很多的話,還是會超時,那麼我們還需要做優化,我們將這些滿足3的點再按照y座標排序,然後再求距離,如果有y座標差大於d的話,就跳出,因為後面的話都是大於y,不存在更小的,所以雖然是兩層for迴圈,其實複雜度並不高

5:總的來說時間複雜度是o(nlogn)

ac:#includeusing namespace std;

const double eps = 1e-6;

const int maxn = 100010;

const double inf = 1e20;

struct point;

double dist(point a,point b)

point p[maxn];

point tmpt[maxn];

bool cmpxy(point a,point b)

bool cmpy(point a,point b)

double closest_pair(int left,int right)

sort(tmpt,tmpt+k,cmpy);

for(int i = 0; i **:

hdu 1007 最近點對 模板

本類題的做法思想就是不斷的二分,直到剩餘兩個點或者三個點時直接算。這裡存在的乙個問題就是可能最近的點對不在二分的左右區間裡,而是跨越兩個區間,所以我們在做時剛開始時,對x軸由小到大排序,然後二分,在二分之後已經得到乙個最小值ans,把在中心線左右ans內的點選出來,把這個區間的點按y座標由小到大排序...

hdu1007 最近點對

題意 給你n個點,讓你求最近的兩個點的距離是多少.思路 這個題目我沒思路,我在網上看的是什麼分治 鴿巢原理,分治我知道,鴿巢原理我也知道,但是這個題目就是沒有證明出來他和鴿巢原理有jm關係,總之就是先以x或者y優先sort一下,然後每次列舉每個相鄰點的附近5個就行了 加自己一共六個 而且這個題目的前...

HDU 1007 最近點對

分治法求最近點對 遞迴將點不斷分成小組,計算最短距離。此時的最短距離僅僅是兩點都屬兩塊的某一塊 這裡的分割點是mid點 還需要考慮兩點分屬兩塊的情況。這時對於選點則把範圍縮小到了以mid為中心。再將距離mid點x軸2 mindist範圍點考慮在內。在這些點中,再取mid點,留下那些 y的距離不大於m...