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<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
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(ha<ke){
        suan(zuo,mid);
    }
    else{
        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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值