凸包面積
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.00.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側尋找最高點,最高點肯定在凸包中,這裡涉及到一些數學知識...