POJ 1905題目解答

2021-12-30 03:12:52 字數 1368 閱讀 9638

poj 1905題目解答:有一根長len的木棍,加熱了n度,長度會膨脹為len*(1+n*c),c為膨脹係數。現在把這根木棍夾在兩堵牆之間,木棍會向上彎曲變成弧形,求弧形中點和原木棍中點的高度差。

一道典型的二分題目,我們會想到直接二分答案dis,然後就可以計算出這個弧所在的圓的半徑,緊接著就可以求出弧長。用求出的弧長與真正的弧長做對比來確定下一次二分的範圍。

但是有個問題,怎麼保證算出的弧長滿足單調性?可以yy一下得到(我蒟蒻,並不會數學嚴格證明:p)。

1.dis小的時候:

2.dis大的時候:

在木棍原長度不變的情況下,dis越大,顯然木棍越膨脹(yy……),所以弧長也就越大,滿足單調性。

滿足了單調性之後,我們就可以安心二分了,這裡再詳細說明一下如何求弧長:

根據勾股定理,我們知道(r-dis)^2+(len/2)^2=r^2,所以:

r^2-2*r*dis+dis^2+len^2/4=r^2

2*r*dis=dis^2+len^2/4

r=(dis+len^2/4/dis)/2

根據len』=2*θ*r=2*acos((r-dis)/r)*r(acos表示反三角函式,即知道cos值求角度(弧度制)),就可以得到弧長。

二分的範圍:弧最多是半圓,所以dis最多是len/2。

特殊:當len=0或n=0或c=0時,答案就是0,最好特判掉。否則可能會造成被0除錯誤。

#include

#include

using namespace std;

const double pi=3.14159265358;

double len,n,c,len_; //len為原長度,len_為膨脹後的長度

bool check(double dis)

int main()

//特判

double l=1e-5,r=len/2,mid;len_=(n*c+1)*len;

while (l<=r)

printf("%.3f\n",r);

scanf("%lf%lf%lf",&len,&n,&c);

}return 0;

}

POJ 1905 二分查詢答案

一道精度很高的問題,雖然也不是很難 傳送門 二分查詢答案 題解 求出r l 2 4h 2 8hs 2r arcsin l 2r 二分區間查詢h和真正的s對比當l r exp不滿足時候跳出求解答案 注意 因為精度很高所以這裡的折半不應該用 2.0而是 0.5,0.5的精度更高 ac include i...

POJ 3669題目解答

poj 3669題目解答 bessie被流星雨襲擊,給出m顆流星,每個流星都有墜落的橫縱座標,以及墜落的時間。每個流星墜落後,該格仔連同上 下 左 右四個格仔都不能走了。bessie從 0,0 出發,每次只能向上 下 左 右移動一格,求達到安全位置的最小移動次數,不能則輸出 1。思路 地圖的大小沒有...

POJ 1007題目解答

poj 1007題目解答 題目要求是對固定長度的字串進行排序,當然排序的前提是按照每個字串內部 使字元達到有序條件的時候需要的轉置交換次數按照從大到小對所有字串進行排序,暴力解法直接計算出每個字串需要進行的轉置次數。include include include using namespace st...