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