td走廊裡有一關「勇闖梅花樁」,水面上稀稀落落地立著幾根柱子。nova君自認為輕功不錯,覺得可以在任意兩根柱子之間跳躍,現在他想挑戰一次跨越距離最遠的兩根柱子。請問,最遠距離是多少?(由於木樁以橫縱座標形式給出,為了計算方便,避免求平方根,答案只需給出距離的平方即可)
多組測試資料(組數不超過10),對於每組資料,第一行為乙個正整數n,代表梅花樁的個數,接下來n行,每行兩個正整數xi, yi分別代表第 i 根樁子的橫縱座標。 (資料在int範圍內)
對於每組資料,輸出一行,為距離最遠的兩根柱子的距離的平方。
3
1 11 2
0 0
5
解題思路:
求出最遠的點對,可以化為求出對應的凸包上最遠的兩個點。
平面凸包 :
定義: 對乙個簡單多邊形來說,如果給定其邊界上或內部的任意兩個點,連線這兩個點的線段上的所有點都被包含在該多邊形的邊界上或內部的話,則該多邊形為凸多邊形 。
在解決平面凸包下面介紹了兩種演算法:
一、 graham掃瞄法,執行時間為o(nlgn)。
二、 jarvis步進法,執行時間為o(nh),h為凸包中的頂點數。
推薦部落格:
推薦部落格:
給出**:
1 #include2 #include3 #include4#define inf -11056
using
namespace
std;
7long
long
i,j,k,n,top,ans;89
struct
node
10no[1000010],stack[1000010
];14
15long
long
dis(node p1,node p2)
1619
20long
long
mult(node p1,node p2,node p0)
2124
25long
long
cmp(node a,node b)
2633
34void
work()
3542
node tmp;
43 tmp = no[0
];44 no[0] =no[k];
45 no[k] =tmp;
46 sort(no+1,no+n,cmp);
47 top = 2
;48 stack[0] = no[0
];49 stack[1] = no[1
];50 stack[2] = no[2
];51
for(i=3; i)
5257}58
59int
main()
6074
}75 printf("
%lld\n
",ans);76}
77return0;
78 }
尋找最遠點對
問題 給定平面上n個點的座標,找出距離最遠的兩個點。分析類似於 最近點對問題 這個問題也可以用列舉的方法求解,時間複雜度o n 2 尋找最近點對 是用到分治策略降低複雜度,而 尋找最遠點對 可利用幾何性質。注意到 對於平面上有n個點,這一對最遠點必然存在於這n個點所構成的乙個凸包上 證明略 那麼可以...
尋找最遠點對
在乙個實際專案中遇到 尋找最遠點對 問題,猛然想起 程式設計之美 擴充套件問題提到過,開心地翻出來看,卻發現 最近點對 的思路套 最遠 貌似不合適。然後開始查文獻 做實驗,改進演算法,困擾半天也發現了不少實際問題,寫出來大家參考。最後,演算法用到系統中,雖然沒有大幅提高遺傳演算法效率,但是系統評價功...
尋找最遠點對
問題 給定平面上n個點的座標,找出距離最遠的兩個點。分析類似於 最近點對問題 這個問題也可以用列舉的方法求解,時間複雜度o n 2 尋找最近點對 是用到分治策略降低複雜度,而 尋找最遠點對 可利用幾何性質。注意到 對於平面上有n個點,這一對最遠點必然存在於這n個點所構成的乙個凸包上 證明略 那麼可以...