二分查詢 膨脹的木棍

2021-08-13 07:18:24 字數 948 閱讀 9634

問題描述:

當長度為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是熱膨脹係數。當一根細木棍被嵌在兩堵牆之間被加熱,它將膨脹形成弓形的弧,而這個弓形的弦恰好是未加熱前木棍的原始位置。你的任務是計算木棍中心的偏移距離。輸入三個非負實數 木棍初始長度 單位 公釐 溫度變化 單位 ...