題目描述
李哲非常非常喜歡檸檬樹,特別是在靜靜的夜晚,當天空中有一彎明月溫柔 地照亮地面上的景物時,他必會悠閒地坐在他親手植下的那棵檸檬樹旁,獨自思 索著人生的哲理。
李哲是乙個喜愛思考的孩子,當他看到在月光的照射下檸檬樹投在地面上的 影子是如此的清晰,馬上想到了乙個問題:樹影的面積是多大呢?
李哲知道,直接測量面積是很難的,他想用幾何的方法算,因為他對這棵檸 檬樹的形狀了解得非常清楚,而且想好了簡化的方法。
李哲將整棵檸檬樹分成了 n 層,由下向上依次將層編號為 1,2,…,n。從第 1 到 n-1 層,每層都是乙個圓台型,第 n 層(最上面一層)是圓錐型。對於圓台型, 其上下底面都是水平的圓。對於相鄰的兩個圓台,上層的下底面和下層的上底面 重合。第 n 層(最上面一層)圓錐的底面就是第 n-1 層圓台的上底面。所有的底面 的圓心(包括樹頂)處在同一條與地面垂直的直線上。李哲知道每一層的高度為 h1,h2,…,hn,第 1 層圓台的下底面距地面的高度為 h0,以及每層的下底面的圓的 半徑 r1,r2,…,rn。李哲用熟知的方法測出了月亮的光線與地面的夾角為 alpha。
題解
腦補一下這個影子長什麼樣子(反正我腦補不出來),是一堆圓和相鄰兩個圓之間構成的梯形構成,我們要求的就是這一大坨東西的面積。
只需要保留兩位小數,我們可以用自適應辛普森積分來求。
然後注意高度要乘上三角函式,但半徑不用,因為平面在豎直方向的投影長度為零。
然後就是用計算幾何亂搞(好噁心)
。細節還是挺多的,可能是我太菜了,斜邊和直角邊都搞錯了。
**
#include#include#include
#define n 602
using
namespace
std;
const
double eps=1e-7
;int
n;double
alpha,h[n],r[n];
struct yuanc[n];
struct xianduanl[n];
inline xianduan _work(yuan a,yuan b);
if(fabs(a.r-b.r)return x=;
double r1=fabs(a.r-b.r),x1=b.x-a.x,zh=sqrt(x1*x1-r1*r1),co=zh/x1,si=r1/x1,x2=a.r/co,x3=b.r/co;
x.k=(x3-x2)/x1;x.b=x2-a.x*x.k;
if(a.r>b.r)x.l=a.x+a.r*si,x.r=b.x+b.r*si;else x.l=a.x-a.r*si,x.r=b.x-b.r*si;
returnx;}
inline
double f(double
x) inline
double simpson(double l,double
r)double solve(double l,double r,double
num)
intmain()
for(int i=1;i1
]);
double l=2e9,r=-2e9;
for(int i=1;i<=n;++i)
printf(
"%.2lf
",solve(l,r,simpson(l,r))*2
);
return0;
}
NOI2005 月下檸檬樹
一堆圓台平行光的投影 在草稿紙上畫一下,發現對於乙個圓,它投影完還是乙個半徑不變的圓。定義樹的軸在投影平面上經過的點為原點,定乙個正方向,建立平面直角座標系,能發現,對於乙個半徑為 r 高度為 h 的圓,投影到平面上是圓心座標為 cot alpha h,0 半徑為 r 的圓 想象有乙個水平的平面,豎...
NOI2005 月下檸檬樹
題意 給定一棵由若干個圓台和圓錐組成的樹,求這棵樹在與地面成 alpha 角的平行光束照射下產生的投影的面積。題解 顯然投影下去之後每個圓的 r 不變,而高度 h 變成 frac 圓的面積可以直接算,兩個圓的公切線形成的梯形用三角函式推一下也可以直接算。那麼直接 simpson 積分算一下就行了。注...
bzoj 1502 NOI2005 月下檸檬樹
檔案的第1行包含乙個整數n和乙個實數alpha,表示檸檬樹的層數和月亮的光線與地面夾角 單位為弧度 第2行包含n 1個實數h0,h1,h2,hn,表示樹離地的高度和每層的高度。第3行包含n個實數r1,r2,rn,表示檸檬樹每層下底面的圓的半徑。上述輸入檔案中的資料,同一行相鄰的兩個數之間用乙個空格分...