HDU 1007 最近點對

2021-06-26 01:33:33 字數 781 閱讀 6343

分治法求最近點對

遞迴將點不斷分成小組,計算最短距離。此時的最短距離僅僅是兩點都屬兩塊的某一塊(這裡的分割點是mid點)。

還需要考慮兩點分屬兩塊的情況。這時對於選點則把範圍縮小到了以mid為中心。再將距離mid點x軸2*mindist範圍點考慮在內。在這些點中,再取mid點,留下那些

y的距離不大於middist 的點進行距離計算。

ps:剛開始min函式寫錯了,寫成了max,一直tle.使用max則會導致選取的點越來越多。tle則就不奇怪了。

對於使用遞迴方法實現分治,其實質使用了小範圍內得到的結果會縮小整體範圍內的搜尋空間。遞迴函式要有範圍引數噢。

遞迴的直觀理解可以是1 2 3 等簡單情況完後得到的結果返回,組拼全域性解。

#include #include #include #include #include #include using namespace std;

const int maxn=100005;

int n;

struct p

p[maxn],ans[maxn];

double min(double a,double b)

sort(ans,ans+cnt,cmpy);

for( i=0;i=res) break;

res=min(res,dist(ans[i],ans[j]));

}return res;

}int main()

{ while(scanf("%d",&n),n)

{int i;

for(i=0;i

hdu1007 最近點對

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

hdu 1007 最近點對

最近點對問題定義 已知上m個點的集合,找出對接近的一對點。在二維空間裡,可用分治法求解最近點對問題。預處理 分別根據點的x軸和y軸座標進行排序,得到x和y,很顯然此時x和y中的點就是s中的點。情況 1 點數小於等於三時 情況 2 點數大於三時 首先劃分集合s為sl和sr,使得sl中的每乙個點位於sr...

最近點對模板 hdu1007

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