P3680 凸輪廓線

2021-09-02 19:19:47 字數 1924 閱讀 4538

一道神奇的計算幾何題

對於一串是圓和正方形開頭和結尾時是十分好做的,這裡也不展開了.

那麼問題來了,三角形開頭時需要怎麼算呢???

如果全部都是三角形那也可以直接算,一串三角形後面是乙個正方形:

可以將這條紅色線段樹放入乙個三角形中,其中一條邊為黃色線段樹,這個還是十分好計算的l=n

−0.5

l=n-0.5

l=n−0.

5(n為三角形個數),還有一條邊為正方形邊長減去綠色線段(正三角形的高),l=1

−3∗0.5

l=1-\sqrt*0.5

l=1−3​

∗0.5

,這樣,這道題的差不多一半的分就被拿到了.

對於這樣一條線段,如果又用剛才的方法那真是太天真了,這樣會導致計算上出現一點小小的偏差,但是絕對能把您卡掉,紅色線段與圓是相切的,所以:

可以通過這樣算出紅色線段的長,但是,在紅色線段上那小小的圓弧要怎麼辦呢

(高倍放大鏡下的圖),將這個角分成幾個角,用三角函式求出弧度,再求出弧長就好了(因為作者懶,具體不解釋).

實在是看見三角函式就頭痛,所以pass了.

#include

#define rap(i,first,last) for(int i=first;i<=last;++i)

#define pi 3.1415926535

using

namespace std;

int n;

double answer,sum,long;

char s[

100]

;double

helf

(char ch)

double

delta

(double a,

double b)

double

delta_2

(double a,

double b)

intmain()

if(l==1)

answer+

=helf

(s[1])

;//第乙個位置不是三角形

else

else

answer+=+

1+sqrt((

1-0.5*

sqrt(3

))*(

1-0.5*

sqrt(3

))+(long-

0.5)

*(long-

0.5))-

(long-1)

;//正方形的計算還是比較簡單的 }if

(r==n)

//以下同理

answer+

=helf

(s[n]);

else

else

answer+=+

1+sqrt((

1-0.5*

sqrt(3

))*(

1-0.5*

sqrt(3

))+(long-

0.5)

*(long-

0.5))-

(long-1)

;}printf

("%.9ld"

,answer)

;}

大樓輪廓線

輸入第一行乙個數表示有n座大樓,後面依次輸入n行,每一行表示大樓的起始點,終點和高度,輸出為大樓輪廓資訊 如下圖 第一行輸出為3 後面有三行輸入表示大樓的資訊 第二行為 1 3 3 第三行為 2 4 4 第三行為 5 6 1 輸出大樓輪廓資訊 第一行 1 2 3 第二行 2 4 4 第三行 5 6 ...

輪廓線動態規劃

這類問題的共同特點是 在乙個比較 窄 的棋盤上進行複雜操作。如果採用傳統方法 以整行整列為狀態 進行動態規劃,將無法進行狀態轉移,因此只能把參差不齊的 輪廓線 作為狀態的一部分。儘管輪廓線的形態複雜,但由於棋盤比較窄,狀態總數仍然可以控制在可以接受的範圍內。直接看例題 1,鋪放骨牌 用1 2骨牌覆蓋...

輪廓線DP 專項

題意 n m n mn m n,m 11 的矩陣,填1 2 1 21 2或2 12 1 2 1方塊,求方案數 解析 以前寫過狀壓的做法,直接一行一行維護,現在寫輪廓線的做法 注意 當前填紅點的意思是,以紅點作為方塊的右下角 因為方塊長度為2,所以對紅點位置有三種操作 向上填 為了使所有方塊填滿,如果...