【題目大意】
首先讀入n,l分別表示有n座城堡以及城牆到城堡的最近距離不得低於l
然後n行輸入每個城堡的平面座標
需要求出最短的能夠滿足條件的城牆長度。
條件:1)城牆到城堡的最近距離不得低於l
2)城牆必須包含最外圈的所有城堡
輸入包含多組資料
保留0位小數輸出
【解題思路】
該題是典型的凸包問題
在此簡單介紹一下凸包:
凸包(convex hull)是乙個計算幾何(圖形學)中的概念。
在乙個實數向量空間v中,對於給定集合x,所有包含x的凸集的交集s被稱為x的凸包。
x的凸包可以用x內所有點(x
1,...x
n)的線性組合來構造.
在二維歐幾里得空間中,凸包可想象為一條剛好包著所有點的橡皮圈。
用不嚴謹的話來講,給定二維平面上的點集,凸包就是將最外層的點連線起來構成的凸多邊型,它能包含點集中所有的點。
筆者求解凸包常用andrew演算法(granham演算法的變種),穩定性較好
【andrew演算法】
int convexhull(point *p,int n,point *q)
int k=m;
for (int i=n-2;i>=0;--i)
if (n>1) m--;
return m;
}
double cross(vector a,vector b)
了解了凸包之後,本題就可以快速解決了。
不用理會l,只需要在最後加上2*pi*l(這是因為所有城堡外圍所對應的圓心角之和為凸包對應多邊形的外角和,即2pi弧度)
【**】
#include#include#include#include#include#include#include#include#include#include#include#define ll long long
#define ui unsigned int
//#define local
using namespace std;
struct point
};typedef point vector;
const double eps=1e-10;
const double pi=acos(-1.0);
vector operator + (vector a,vector b)
vector operator - (point a,point b)
vector operator * (vector a,double p)
vector operator / (vector a,double p)
bool operator < (const point &a,const point &b)
int k=m;
for (int i=n-2;i>=0;--i)
if (n>1) m--;
return m;
}const int n=1011;
int t;
int n,l;
point p[n],q[n];
int main(){
#ifdef local
freopen("hdu1348.in","r",stdin);
#endif
scanf("%d",&t);
while (t--){
double ans=0;
int opt=0;
scanf("%d%d",&n,&l);
for (int i=0;i
【總結】
凸包求法以及多邊形外角和的巧妙處理
凸包入門之卷包裹法 hdu 1348 wall
在二維空間中,凸包可以簡單的認為是最小的包含所有點的凸多邊形。簡單的卷包裹法 尋找最邊緣 最下方的,次之是最左邊的 或者最左邊的,次之最下邊 點。假想用一根繩子向右逆時針旋轉碰到另乙個點,這樣新找到的點作為端點,繼續旋轉繩子重複找點的步驟,一直圍成乙個凸多邊形。時間複雜度 o n 2 我把此 和gr...
二維凸包(模板) hdu 1348 求凸包的周長
凸包模板 const int n 1010 const double pi 3.1415927 double eps 1e 10 考慮誤差的加法運算 double add double a,double b struct point point double x,double y x x y y 建...
POJ 1113 Wall 圍牆 凸包
題意 給出一系列的點,在凸包外面l公尺建造圍牆,求圍牆的長度。其實就是裸凸包 半徑l的圓周長。這題卡了一下午.由於裡面的精度有些問題.後面輸出最好用 f不要用lf和int轉換.第一次做凸包,感覺還好.author illuz blog file poj1113.cpp create date 201...