swustoj凸包面積(分治法)

2021-08-18 22:32:35 字數 1736 閱讀 2719

麥兜是個淘氣的孩子。一天,他在玩鋼筆的時候把墨水灑在了白色的牆上。再過一會,麥兜媽就要回來了,麥兜為了不讓媽媽知道這件事情,就想用乙個白色的凸多邊形把牆上的墨點蓋住。你能告訴麥兜最小需要面積多大的凸多邊形才能把這些墨點蓋住嗎? 現在,給出了這些墨點的座標,請幫助麥兜計算出覆蓋這些墨點的最小凸多邊形的面積。

輸入

多組測試資料。第一行是乙個整數t,表明一共有t組測試資料。

每組測試資料的第一行是乙個正整數n(0< n < = 105),表明了墨點的數量。接下來的n行每行包含了兩個整數xi和yi(0<=xi,yi<=2000),表示每個墨點的座標。每行的座標間可能包含多個空格。

輸出
每行輸出一組測試資料的結果,只需輸出最小凸多邊形的面積。面積是個實數,小數點後面保留一位即可,不需要多餘的空格。

樣例輸入

2

40 0

1 00 1

1 12

0 00 1

樣例輸出
1.0

0.0

題解:分治法求解。

1,找出所有點中x值最小和最大的點就是凸包頂點。

2,以這兩點為界將點劃分為上包和下包。

3,求上包:每次找離直線最遠的點,必是凸包頂點。下包一樣求解。

3,遞迴求解上下包,順便求面積。

#include#include#include#include#include#include#include#include#includeusing namespace std;

struct node s[105];

vectorans;

vector::iterator it;

double ansans;

//求點s3在點s1,s2所連直線的上邊,如果滿足返回true

bool isup(node s1, node s2, node s3)

else if(juge <= 0)

}//求兩點直線距離

double getlinedis(node s1, node s2)

//求三點決定的三角形面積

double getdis(node s1, node s2, node s3)

//isupdp為1代表求上包,否則下包

void getup(node s1, node s2, vectorup,bool isupdp)

if (tt)

} else

} }ans.push_back(temp);

ansans += maxs;

if (up.size() > 1)

}bool cmp(node a, node b)

int main()

if (s[_minid].x < s[i].x)

} vectorup, down;

for (int i = 0;i < n;i++)

else

}} ans.push_back(s[_minid]);

ans.push_back(s[_maxid]);

getup(s[_minid], s[_maxid], up, 1);

getup(s[_minid], s[_maxid], down, 0);

sort(ans.begin(), ans.end(), cmp);

printf("%.1lf\n", ansans);

ansans = 0;

} return 0;

}

swust oj凸包面積 0249 分治法

本文目錄 oj題目 分治法思路 具體過程 tips 測試資料 這道題本身不是很難喲,不要被嚇到,然後就可以開始做了o o 題目 分治法思路 見 先預排序,預排序後最左和最右的點肯定是凸包中的點。然後可以遞迴的從內向外擴充套件凸包,在當前直線的2側尋找最高點,最高點肯定在凸包中,這裡涉及到一些數學知識...

swust oj 249 凸包面積

凸包面積 1000 ms 65535 kb 1078 3483 tags 分治法 麥兜是個淘氣的孩子。一天,他在玩鋼筆的時候把墨水灑在了白色的牆上。再過一會,麥兜媽就要回來了,麥兜為了不讓媽媽知道這件事情,就想用乙個白色的凸多邊形把牆上的墨點蓋住。你能告訴麥兜最小需要面積多大的凸多邊形才能把這些墨點...

swust OJ 249 求凸包面積模板

用graham scan 求出凸點,再用叉積求面積,乙個三角形的面積等於叉積的一半。define ios ios sync with stdio false cin.tie 0 cout.tie 0 include define int long long using namespace std t...