給出乙個n邊多邊形,要求構造另乙個圖形,使新多邊形在舊多邊形外部,且最近處的距離大於等於l,還要使構造的圖形面積盡量小。
求新構造形狀的邊長
3 ≤ n ≤ 1000,1 ≤ l ≤ 1000
首先要理解好題意。。。是多邊形外套某圖形。
很容易想到的辦法是,處處與內部間隔l,這就要求了在拐角處可能會出現圓弧,經過更加細緻的考慮,發現將多邊形的邊垂直外推l,拐角處設定圓弧即可。
但是這個問題還有兩個細節:原多邊形的凹凸問題,拐角處的弧長具體怎麼算。
先考慮第乙個問題,如果只是簡單外推,發現這種外圍不是最優的,紅色是凹部分的外推,但是綠色才是更短的(也是最短的)。
為了避免這種凹處的外推,就消除掉原多邊形的凹處,首先作原多邊形的凸包,再將邊進行外推。
這裡的綠色,其實就是凸包外推的結果。
拐角的弧長,也就是凸包外推後連線間斷點的弧,圓心是凸包的頂點
像這個,未標出的那段弧就是計入在最終長度的弧
計入長度弧長的圓心角可以發現是 180-w,每乙個頂點都是這樣,也就是說,最終計入的圓心角是:
n π−
(n−2
)π=2
πn\pi-(n-2)\pi=2\pi
nπ−(n−
2)π=
2π,前面是因為n個頂點,後面是凸n邊形的內角和
現在就發現,最終新圖形的長度是由內多邊形凸包的邊長 + 2πl
2\pi l
2πl構成
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
struct point
point
(double a,
double b):x
(a),
y(b)
double x, y;
intdcmp
(double x)
//誤差取等
bool
operator
<
(const point& other)
//為了sort
else
}bool
operator==(
const point& other)
//為了unique};
struct vect//向量
//從點構造向量
double
cross
(vect other)
//叉積};
vector v;
//存所有點,並進行從小到大排序
int line[
1005
], ptr =0;
//儲存凸殼路徑
void
convex()
//求凸殼
}double
dis(point& a, point& b)
intmain()
sort
(v.begin()
, v.
end())
; v.
resize
(unique
(v.begin()
, v.
end())
- v.
begin()
);//去重點
double ans =0;
//記錄凸殼長度
convex()
;//求下凸殼
for(
int i =
1; i < ptr; i++
) ptr =0;
reverse
(v.begin()
, v.
end())
;convex()
;//求上凸殼
for(
int i =
1; i < ptr; i++
) ans +
=3.141592653538462643383279*2
*l; cout << fixed <<
setprecision(0
)<< ans;
return0;
}
洛谷P5049 洛谷P5022 題解 旅行
原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...
洛谷練習P2279 P1346
2020年,人類在火星上建立了乙個龐大的基地群,總共有n個基地。起初為了節約材料,人類只修建了n 1條道路來連線這些基地,並且每兩個基地都能夠通過道路到達,所以所有的基地形成了乙個巨大的樹狀結構。如果基地a到基地b至少要經過d條道路的話,我們稱基地a到基地b的距離為d。由於火星上非常乾燥,經常引發火...
洛谷 P1396 營救
題目描述 咚咚咚 查水表!原來是查水表來了,現在 找這麼熱心上門的查表員啊!小明感動的熱淚盈眶,開起了門 媽媽下班回家,街坊鄰居說小明被一群陌生人強行押上了警車!媽媽豐富的經驗告訴她小明被帶到了t區,而自己在s區。該市有m條大道連線n個區,一條大道將兩個區相連線,每個大道有乙個擁擠度。小明的媽媽雖然...