一個街道兩側有兩棟樓,如今有如圖所示兩樓梯 \(x,y\)。
兩個樓梯分別如圖放置。
已知兩個樓梯的長度和他們交點離地面的高度,求兩棟樓之間的距離。ios
一行三個實數,分別表示 \(x,y,c\)。spa
輸出共包含 1行。
即所求的兩棟樓之間的距離,保留三位小數。code
\(0<a,b,c<2500\)
保證數據合法。blog
30 40 10ci
26.033數學
這個看起來不是那麼難,第一眼確定是推公式而後\(O(1)\)輸出,我也是這麼想的,但發現根本推不出來!多是我數學太差了?因此考慮用計算機來算這個數學題,這個問題實際上是有單調性的,由\(x,y,c\)推出距離\(s\)很很差推,但由\(x,y,s\)推\(c\)倒是十分簡單。
而觀察能夠發現,當兩個樓之間距離太小時,由於\(x,y\)必定,因此\(c\)必定會更高,過大時就會更低,根據這個二分答案就行。
那麼,\(c\)怎麼求呢?除\(s\)外的兩條直角邊的倒數和跟\(c\)的倒數是同樣的,初中的孩子都會證啦,設輔助元用類似就行。io
#include<iostream> #include<cstdio> #include<cmath> using namespace std; double a,b,c; double check(double x){ double l=sqrt(a*a-x*x); double r=sqrt(b*b-x*x); return l*r/(l+r); } int main(){ cin>>a>>b>>c; double l=0,r=min(a,b); while(r-l>=1e-5){ double mid=(l+r)/2; if(check(mid)>c)l=mid; else r=mid; } printf("%.3lf\n",r); }