OpenJudge 1.11-09膨胀的木棍——题解

上回(很久以前那个)说到,勇者最终还是走出山洞,但是却在山间迷路了。
现在,勇者一行人找到了一座桥,并且得知走过这桥大概就能走下这座山,但这桥吧不太结实,受到风吹日晒雨淋的就会膨胀收缩,极度影响稳定性,于是勇者为了保证安全通过,用木棍代替桥做了实验,希望能求出木棍中心的偏移距离。


总时间限制:
1000ms
内存限制:
65536kB
描述
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L’=(1+n*C)*L,其中C是热膨胀系数。
当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。
你的任务是计算木棍中心的偏移距离。
输入
三个非负实数:木棍初始长度(单位:毫米),温度变化(单位:度),以及材料的热膨胀系数。
保证木棍不会膨胀到超过原始长度的1.5倍。
输出
木棍中心的偏移距离(单位:毫米),保留到小数点后第三位。

这是一道很老的题了(大概?)也是二分答案的很经典的题。
路由器最初想法是二分偏移距离最终求答案,但是因为太麻烦所以换了一个二分方法。
我们二分圆心角的度数(0到pai/2)运用一点几何知识就能确定圆心角度数了。
然后就算就行了。
需要注意三点:
1.精度看提问中应该是1e-11
2.注意如果没有变化的话输出0.000(不要忘了精确到三位……就这个debug了很久)
3.自带的sin函数的变量要为弧度(debug累啊…………)
路由器上传代码ing

#include
#include
#include
#include
#include
using namespace std;
const double pi=3.14159265358;
double l,c,n,l1;
void suan(double zuo,double you){
    double mid=(zuo+you)/2;
    double ha=sin(mid);
    //printf("%lf\n",ha);
    double r=l1/2/mid;
    //printf("%lf\n",r);
    double ke=l/2/r;
    //printf("%lf\n",ke);
    //return;
    if(fabs(ha-ke)<=1e-11){
        //printf("%lf\n",r);
        printf("%.3lf",r*(1-cos(mid)));
        return;
    }
    else if(haelse{
        suan(mid+1e-11,you);
    }
}
int main(){
    scanf("%lf%lf%lf",&l,&n,&c);
    l1=(1+n*c)*l;
    if(l1==l){
        printf("0.000");
        return 0;
    }
    suan(0,pi/2);
    return 0;
}

你可能感兴趣的:(二分)