題解 膨脹的木棍 思維 二分

2021-10-03 07:58:23 字數 2805 閱讀 8398

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()  

5

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 }

view code

三角函式公式補充:

二分查詢 膨脹的木棍

問題描述 當長度為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 ...