題意:給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 ...