麥兜是個淘氣的孩子。一天,他在玩鋼筆的時候把墨水灑在了白色的牆上。再過一會,麥兜媽就要回來了,麥兜為了不讓媽媽知道這件事情,就想用乙個白色的凸多邊形把牆上的墨點蓋住。你能告訴麥兜最小需要面積多大的凸多邊形才能把這些墨點蓋住嗎? 現在,給出了這些墨點的座標,請幫助麥兜計算出覆蓋這些墨點的最小凸多邊形的面積。
輸入
多組測試資料。第一行是乙個整數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
題解:分治法求解。
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...