有 n 個圓盤從天而降,後面落下的可以蓋住前面的。最後按掉下的順序,在平面上依次測得每個圓盤的圓心和半徑,問下落完成後從上往下看,整個圖形的周長是多少,即你可以看到的圓盤的輪廓的圓盤的輪廓總長.例如下圖的黑色線條的總長度即為所求。
第一行為1個整數n
接下來n行每行3個實數,ri,xi,yi,表示下落時第i個圓盤的半徑和圓心座標.
僅乙個實數,表示所求的總周長,答案保留3位小數.
21 0 0
1 1 0
10.47230%的資料,n<=10
100%的資料,n<=1000
數學問題 計算幾何
用餘弦定理和三角函式可以計算出兩圓相交部分的弧長。
對於每個圓,計算它和在它之後落下的所有圓的角。記錄相交部分的弧對應的圓心角範圍。將「圓心角」區間離散到0~2pi的數軸上,做線段覆蓋。
知道了未被覆蓋的角總共有多大,就能算出該圓未被覆蓋的弧有多長。
注意如果求出的覆蓋部分圓心角範圍超出了0~2pi,要變換到0~2pi範圍內
1 #include2 #include3 #include4 #include5 #include6 #include7using
namespace
std;
8const
double pi=acos(-1.0);9
const
double eps=1e-7;10
const
int mxn=1010;11
struct
point;}
14 point operator - (point b);}
15double
operator * (point b)
16};
17 inline double
cross(point a,point b)
20 inline double
dist(point a,point b)
23 inline double len(point a)
24struct
cir;}
28 point operator - (cir b);}
29}c[mxn];
30 inline bool
cover(cir a,cir b)
33struct
line
38};
39line cx(cir a,cir b);
44/*
double t=(a.r*a.r+dis*dis-b.r*b.r)/(2*dis);
45double st=atan2(a.x-b.x,a.y-b.y);
46double l=acos(t/a.r);
47return (line);
*/48
}49 vectorve;
50int
n;51
double ans=0;52
void calc(int
x)//
被完全覆蓋
54ve.clear();
55for(int i=x+1;i<=n;i++));
64 ve.push_back((line));65}
66else
ve.push_back(tmp);67}
68sort(ve.begin(),ve.end());
69//
printf("mid\n");
70double now=0,ran=0;71
for(int i=0;i//
線段覆蓋
72 line tmp=ve[i];
73//
printf("i:%d %.3f %.3f\n",i,tmp.l,tmp.r);
74if(tmp.l>now)
75else now=max(now,tmp.r);76}
77 ran+=2*pi-now;
78 ans+=c[x].r*ran;//
累加半徑
79return;80
}81intmain()
89for(i=n;i>=1;i--)
93 printf("
%.3f\n
",ans);
94return0;
95 }
BZOJ1055 HAOI 玩具取名
某人有一套玩具,並想法給玩具命名。首先他選擇wing四個字母中的任意乙個字母作為玩具的基本名字。然後 他會根據自己的喜好,將名字中任意乙個字母用 wing 中任意兩個字母代替,使得自己的名字能夠擴充得很長。現在,他想請你猜猜某乙個很長的名字,最初可能是由哪幾個字母變形過來的。第一行四個整數w i n...
BZOJ 1046 HAOI 上公升序列
1046 haoi2007 上公升序列 time limit 10 sec memory limit 162 mbsubmit 5376 solved 1862 submit status discuss description 對於乙個給定的s 若有p 滿足 x1 x2 xm 且 ax1 2 出s...
bzoj2431 HAOI2009 逆序對數列
對於乙個數列,如果有ii aj,那麼我們稱ai與aj為一對逆序對數。若對於任意乙個由1 n自然數組成的數列,可以很容易求出有多少個逆序對數。那麼逆序對數為k的這樣自然數數列到底有多少個?第一行為兩個整數n,k。寫入乙個整數,表示符合條件的數列個數,由於這個數可能很大,你只需輸出該數對10000求餘數...