POJ 1113 Wall 凸包 一點思維

2021-09-11 16:24:01 字數 1717 閱讀 9472

現在有n個點,要求在n個點外面建柵欄,要求每個點到柵欄的距離都大於等於l,問需要的最短柵欄長度。

需要柵欄將n個點包圍,第一反應可以想到凸包,然後再在凸包外面加柵欄。由於柵欄距離凸包的距離要大於l,因此我們思考如何加柵欄。

對於凸包的每個頂點,向連線頂點的兩條線段建立垂線,長度為l,其餘地方連成直線。可以發現最後就是凸包的總長度加上那幾個小圓周的長度。然後我們來計算小圓周的度數。假設凸包一共有num個頂點,則凸包內角和為180*(num-2),圖中可以發現 b = 180-a,共有num個頂點,將num個b加起來可以得到,180*num-num*a,num*a = 180*(num-2),因此ans = 360,所有小圓周的角度加起來為360度。因此ans = 凸包周長+半徑為l的圓的周長。

最後的時候是%.0f輸出,一開始下取整轉成int一直wa...

#include #include #include #include #include #include #define rep(i,a,b) for(int i = a; i <= b; i++)

#define pi acos(-1.0)

#define cross(p1,p2,p3) ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y)) //向量(p1,p2)與(p1,p3)叉乘

#define crossop(p1,p2,p3) sign(cross(p1,p2,p3)) //判斷正負,順時針為負

using namespace std;

//實數比較

typedef double db;

const db eps = 1e-9;

inline int sign(db a) //返回-1表示a < 0, 1表示a > 0, 0表示a = 0

inline int cmp(db a, db b) //返回-1表示a < b, 1表示a > b,0表示 a==b

//點類

struct p

p(db _x, db _y) : x(_x), y(_y) {}

p operator+(p p) ; }

p operator-(p p) ; }

p operator*(db d) ; }

p operator/(db d) ; }

db dot(p p) //點積

db det(p p) //叉積

p rot(db an) ; } //旋轉

db abs()

db abs2()

db disto(p p)

int quad() const //判斷該點是否在x軸上方或x軸上

bool operator

bool operator==(p p) const

};db area(vectorps)

db perimeter(vectorps)

vectorconvexhull(vectorps)

int main()

ld = convexhull(ld);

db ans = perimeter(ld);

ans += 2*pi*(double)l;

printf("%.0f\n",ans);

} return 0;

}

POJ 1113 Wall 圍牆 凸包

題意 給出一系列的點,在凸包外面l公尺建造圍牆,求圍牆的長度。其實就是裸凸包 半徑l的圓周長。這題卡了一下午.由於裡面的精度有些問題.後面輸出最好用 f不要用lf和int轉換.第一次做凸包,感覺還好.author illuz blog file poj1113.cpp create date 201...

POJ 1113 Wall 凸包周長

題意 給定n nn個城堡的座標,要求建設連續的圍牆,且圍牆上任意一點距離任意城堡距離不小於l ll,求圍牆的最小長度。求出這些點的凸包,答案即凸包長度加上乙個半徑為l ll的圓的周長,即對於凸包的邊,在距離凸包邊l ll處建設平行的圍牆即可,而對於拐角處,畫半徑為l ll的圓即可,最後各個拐角處可以...

POJ 1113 Wall 凸包 思維

1.題意 給出n個點,讓你建立一圈圍牆,將n個點圍起來並且,每個點距離圍牆都 l,讓求在這個條件下的最小圍牆周長 2.分析 最小周長,首先想到凸包,但是這裡有個距離問題 我們最初想的,凸包周長整體外擴l 但是我們發現,每個凸包頂點,到圍牆頂點的距離 l,浪費了一部分 如果走這段弧長,假設有n個頂點,...