一道神奇的計算幾何題
對於一串是圓和正方形開頭和結尾時是十分好做的,這裡也不展開了.
那麼問題來了,三角形開頭時需要怎麼算呢???
如果全部都是三角形那也可以直接算,一串三角形後面是乙個正方形:
可以將這條紅色線段樹放入乙個三角形中,其中一條邊為黃色線段樹,這個還是十分好計算的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,所以對紅點位置有三種操作 向上填 為了使所有方塊填滿,如果...