ACWing 1510 樓梯

題目連接https://www.acwing.com/problem/content/1512/

一個街道兩側有兩棟樓,如今有如圖所示兩樓梯 \(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);
}
相關文章
相關標籤/搜索