4667 Building Fence 解題報告

2021-09-07 21:58:33 字數 1207 閱讀 6709

題意:給n個圓和m個三角形,且保證互不相交,用乙個籬笆把他們圍起來,求最短的周長是多少。

解法1:在每個圓上均勻的取2000個點,求凸包周長就可以水過。

解法2:求出所有圓之間的外公切線的切點,以及過三角形每個頂點的的直線和圓的切點,和三角形的三個頂點。這些點做凸包確定籬笆邊上的圖形。凸包的邊和圓弧之和即為所求。求圓弧長度的時候要判斷是優弧還是劣弧。用叉積判斷兩個向量的方向關係即可。

//time:218ms

//memory:860k

include #include #include #include #include using namespace std;

const double eps = 1e-10;

const double pi = acos(-1.0);

const int maxn = 55;

int dcmp(double x)

int k = m;

for(int i = n-2; i >= 0; i--)

if(n > 1) m--;

return m;

}vector rotate(vector a,double rad)

void get_ocmt(circle c1,circle c2,point &s1, point &e1,point &s2,point &e2)

void get_pc(circle c, point p,point &s1,point &s2)

point p[55*55*55],ch[55*55*55];

int main()

if(n==1&&m==0)

for(int i = 0; i < m; i++)

for(int j = 0; j < 3; j++)

tri[i].p[j].input();

pn = 0;

for(int i = 0; i < n; i++)

for(int j = i+1; j < n; j++)

for(int i = 0; i < n; i++)

for(int j = 0; j < m; j++)

for(int k = 0; k <3; k++)

for(int j = 0; j < m; j++)

for(int k = 0; k <3; k++)

chn = convexhull(p,pn,ch);

//cout<

USACO Hamming Codes 解題報告

資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...

USACO Closed Fences 解題報告

幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...

Wiggle Subsequence解題報告

這道題和最長子序列,divisible subset題目類似,都可以用o n2 的時間複雜度完成。可以想象,對於第i個數,dp i dp j 1,當且僅當dp j 1 dp i 而且nums j 和nums i 的差值和j所處位置的差值符號相反。所以,如下 class solution if dp ...