swust oj 249 凸包面積

2021-08-19 07:10:47 字數 1499 閱讀 3697

凸包面積

1000(ms)

65535(kb)

1078 / 3483

tags: 分治法

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

輸入

多組測試資料。第一行是乙個整數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

乙個凸包寫了兩天也是醉醉的~,最開始用快包寫,發現求不了面積好像…所以後來就用了graham演算法,大意就是先找到乙個基準點,就是橫座標最小的情況下,縱座標最小的點,然後開始對其他的點和基準點角度大小進行排序,然後開始遍歷,要保證每個新的點要在上乙個點的上面,即使得邊向外凸即可。注意要刪掉排序時角度相同的點,以便於計算面積。#include#include#include#include#include#include#includeusing namespace std;

struct point

;point p[10000];

int ans[10000];

int n;

int k = 0;

int chas(point a, point b, point c)

bool cmp(point a, point b)

else

return false;

}void swap(point &a, point &b)

void graham(int m)

ans[k++] = i; }}

int main()

else if (minl == p[i].x && p[i].y < p[minid].y)

}if (n<= 2)

swap(p[0], p[minid]);

sort(p + 1, p + n,cmp);

int m = 2;

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

}graham(m);

double mian = 0;

while (k >= 2)

mian += m;

k--;

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

} return 0;

}

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...

swustoj凸包面積(分治法)

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

swust oj凸包面積 0249 分治法

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