openjudge-膨脹的木棍
總時間限制: 1000ms 記憶體限制: 65536kb 描述
當長度為l的一根細木棍的溫度公升高n度,它會膨脹到新的長度l'=(1+n*c)*l,其中c是熱膨脹係數。
當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。
你的任務是計算木棍中心的偏移距離。
輸入三個非負實數:木棍初始長度(單位:公釐),溫度變化(單位:度),以及材料的熱膨脹係數。
保證木棍不會膨脹到超過原始長度的1.5倍。
輸出木棍中心的偏移距離(單位:公釐),保留到小數點後第三位。
樣例輸入
1000 100 0.0001樣例輸出
61.329參考:
1 #include2 #include3 #define pi (acos(-1))4 #define eps (1e-14)
5 int main(int argc, char *ar**)
6 20
21 l1=(1+n*c)*l;
22
23 //下面對圓心角進行二分列舉
24 //(膨脹量不超過原來的1.5倍,
25 //分析圓的半周長pi*r與直徑2*r的關係可知圓心角範圍0~2*pi而且不可能取2*pi)
26 mincentralangle=0;//圓心角的極小值
27 maxcentralangle=pi;//圓心角的極大值
28 while(mincentralangle=l1)//當弦長固定時,圓心角越大 ,弧長就越大
34 maxcentralangle=centralangle;
35 else if(l2一定要注意:我們需要二分的內容是當前角度,那麼角度的範圍可以很容易發現,因為木棍長度不超過1.5倍那麼就定角度為0-π
因為如果圓心角過小會發現半徑十分的大根本存不下,其實這種情況的時候木棍長度的變化也是十分的小的那麼
if(n * c * l <= eps)
判斷一下如果滿足那麼直接就輸出0.000,
另外要注意:當弦長固定時,圓心角越大 ,弧長就越大 。
網友jeremygjy的**和分析很好,摘抄一下:
csdn網友tank_long的分析更精彩,只不過下面這個圖的公式似乎有點亂。
公式大概如下:
首先要注意θ角是圓心角的一半。然後根據數學公式有:
sinθ=2sin(θ/2)cos(θ/2)
1-cosθ=2sin(θ/2)2
然後還要注意根據直角三角形正弦的定義有:l=2*r*sinθ
根據弧長公式有ll=2*r*θ
所以h=r-r*cosθ=r*(1-cosθ)=l/(2*sinθ)*(1-cosθ)=l/(2*sinθ)*(2sin(θ/2)2)=l/( 2* ( 2*sin(θ/2)*cos(θ/2) ) )*(2sin(θ/2)2 )
最後h=l/2*tan(θ/2)
注意到θ是圓心角的一半,所以θ得區間是0~pi,根據正切函式圖形性質可以知道當l固定時,h跟θ是成正比關係的。
tank_long的**:(不得不佩服起數學功底啊……)
1 #include2 #include3 #include4 int main()view code5
14 ll=l*(1+n*c);
15 lef=0.0; //角的極小值
16 rig=asin(1.0); //角的極大值
17 //由於三角函式轉換,得到 h= (l/2)*tan(@/2) , 所以h只與角@有關,使用二分逼近法去求解最接近的@即可
18 //注意,二分驗證是讓 ll與角@ 計算得到的 木棍原始長度l`=ll*sin@/@ 與 l 進行比較,且l`與@成反比例關係
19 while(rig-lef>1e-14) //在極大值與極小值之間進行二分,這個地方精度控制太低就過不了了。精度要求很高。
20
27 printf("%.3lf\n", l/2*tan(lef/2));
28 return 0;
29 }
三角函式公式補充:
二分查詢 膨脹的木棍
問題描述 當長度為l的一根細木棍的溫度公升高n度,它會膨脹到新的長度l 1 n c l,其中c是熱膨脹係數。當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。你的任務是計算木棍中心的偏移距離。三個非負實數 木棍初始長度 單位 公釐 溫度變化 單位 ...
二分 差分 思維
二分 差分 思維 當猜了乙個數 x 總共有三種情況 裁判說數大了,那麼裁判說對的取值範圍是 x 裁判說數小了,那麼裁判說對的取值範圍是 x,裁判說數一樣,那麼裁判說對的取值範圍是 x,x 那麼我們只需要求最大有多少個區間重疊了就行了,問題就轉化成了區間的修改,單點查詢,可以考慮差分了。注意題目資料 ...
攀爬 二分, 思維
若存在乙個合法的攀爬序列,則其形式一定是 ak i 1 m ai bi la sum limits m a i b i geq l ak i 1 m ai bi l,於是考慮列舉 a ka k ak 設 di ai b id i a i b i di ai bi 按 d dd從大到小排序,然後 o ...