分治嘗試A

2021-07-31 03:12:48 字數 954 閱讀 2488

簡單的分治

平面上最近點對

description

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

input

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

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

output

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

sample input 3

1  1

1  2

2  2

sample output

1.0000

思路:看到本題我們最容易想到的是每兩個點進行一次測距,顯然的是時間複雜度過高很有可能t掉,所以我們要對其進行優化。用分治的思想進行優化,首先將所有的點在平面以x從小到大的方式進行排列,然後進行二分,算出left和right的兩個區域中兩點間的最短距離,我們會發現還有一種情況二分線的左右可能存在兩個點距離最小,那這兩個點會在什麼區域內呢?這時,left和right區域的最小值我們是已知的,最小值存在比較得出最小值min,那麼在若整個區域的最小值是在二分線兩邊的兩個點的距離。則x的範圍必在二分線-min到二分線+min。(可證min=3,完全可以解決問題)

**:

#include#include#includedouble x[60001],y[60001];

double small(int a,int b) //計算區域最小值

int partition(double a,double b,int low,int high) //大於pivot的位於pivot右側,小於pivot的位於左側(qsort)

else

printf("%.4f",sqrt(min));

return 0;

}

嘗試著說,嘗試著做

成長,需要磨練 生活,需要經歷 習慣,需要堅持。心裡有什麼,說出來 想什麼,寫出來 要什麼,做出來。很多東西,如果自己不去說,不去做。就真的成為自己的東西了,成為爛在自己心裡的東西了。如果自己不知道自己想做什麼,會做什麼,就嘗試著去想,嘗試著去做,不能讓自己在混沌中屏跡。如果自己沒有自己的心聲,就嘗...

分治入門 樹分治

分治思想 劃分子問題,解決子問題,合併子問題 題目 poj1741 題意 給定一棵含有n個節點的無向帶權樹,滿足距離 k的兩點共有多少對?n 1e4 題解 1 首先找到樹a的重心,重心指的是乙個節點,將該節點刪去之後剩下的最大子樹的節點數最小 將其作為樹a的根。在數列的分治之中我們是直接去區間的中間...

分治入門 平面分治

分治思想 劃分子問題,解決子問題,合併子問題 題目 uva 10245 題意 在乙個二維平面內給定n個點,求最近的兩個點的距離。n 10000 題解 直接暴力列舉所有點是肯定行不通的。那麼基於分治的思想 按照橫座標排序後,分成兩個部分,那麼最近距離的點對就是以下的情況 1 兩個點均屬於乙個區域 2 ...