問題描述:
當長度為l的一根細木棍的溫度公升高n度,它會膨脹到新的長度l'=(1+n*c)*l,其中c是熱膨脹係數。
當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。
你的任務是計算木棍中心的偏移距離。
三個非負實數:木棍初始長度(單位:公釐),溫度變化(單位:度),以及材料的熱膨脹係數。
保證木棍不會膨脹到超過原始長度的1.5倍。 輸出
木棍中心的偏移距離(單位:公釐),保留到小數點後第三位。
樣例輸入
1000 100 0.0001
樣例輸出
61.329
問題分析:
由數學內容可知弧長和弦長有關,f(l) = 2rarcsin(l/2r) f(l)表示弦長,l表示弧長。我們可以通過列舉r,尋找能滿足上述關係的r,我們知道r的下限是l/2,但是如何確定r的上限。arcsin(l/2r)隨r的增大而減小,2r卻在增大,所以整個函式的增減性不容易判斷。故r的上限無法確定,也就沒法辦用二分查詢。
此時,我們把關注點轉向夾角,假設圓心角的度數為a,則有
2sin(a/2)/l*a = f(l),顯然當a處於[0,pi]時,左側函式遞增,即左側函式的函式值隨a的增大而增大,那麼他必然會和f(l)產生交匯點。這時就可以用折半查詢來確定a的解,而a的上下限就是[0,pi]。
過程分析:
2sin(a/2)/l*a = f(l) (1)
這個題最大的亮點是不斷的嘗試a,讓等式(1)的兩邊不斷接近,求得最終a的取值,而不是想盡辦法數學公式把a表示出來,然後代入求解。
參***:
#include
#include
#include
using namespace std;
int main()
printf("%.3f",l/2/sin(d/2)*(1-cos(d/2))); }
題解 膨脹的木棍 思維 二分
openjudge 膨脹的木棍 總時間限制 1000ms 記憶體限制 65536kb 描述 當長度為l的一根細木棍的溫度公升高n度,它會膨脹到新的長度l 1 n c l,其中c是熱膨脹係數。當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。你的任務...
openjudge 膨脹的木棍
總時間限制 1000ms 記憶體限制 65536kb 描述 當長度為l的一根細木棍的溫度公升高n度,它會膨脹到新的長度l 1 n c l,其中c是熱膨脹係數。當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。你的任務是計算木棍中心的偏移距離。輸入三...
1 11 09 膨脹的木棍
描述 當長度為l的一根細木棍的溫度公升高n度,它會膨脹到新的長度l 1 n c l,其中c是熱膨脹係數。當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。你的任務是計算木棍中心的偏移距離。輸入三個非負實數 木棍初始長度 單位 公釐 溫度變化 單位 ...