【Light】[1062]Crossed Ladders

这里写图片描述

可以根据题目列出一个关于高度c和间隔d的方程

cx2d2+cy2d2=1
化简得

c=11x2d2+1y2d2

可知若d比res大
则c应该比所给c小
由此可把mid与res进行比较
从而进行二分查找

#include<stdio.h>
#include<math.h>
double x,y,c;
bool judge(double m) {
    double res=1.0/(1.0/sqrt(y*y-m*m)+1.0/sqrt(x*x-m*m));
    if(res>c)
        return true;
    else
        return false;
}
int main() {
    int T,kase=0;
    scanf("%d",&T);
    while(T--) {
        scanf("%lf %lf %lf",&x,&y,&c);
        double l=0,r=(x<y?x:y);
        while(r-l>1e-8) {
            double mid=(l+r)/2;
            if(judge(mid))
                l=mid;
            else
                r=mid;
        }
        printf("Case %d: %.8lf
",++kase,l);
    }
    return 0;
}

题目地址:【Light】[1062]Crossed Ladders

原文地址:https://www.cnblogs.com/BoilTask/p/12569477.html