-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L'=(1+n*C)*L,其中C是热膨胀系数。
当一根细木棍被嵌在两堵墙之间被加热,它将膨胀形成弓形的弧,而这个弓形的弦恰好是未加热前木棍的原始位置。
你的任务是计算木棍中心的偏移距离。
输入
- 三个非负实数:木棍初始长度(单位:毫米),温度变化(单位:度),以及材料的热膨胀系数。
- 保证木棍不会膨胀到超过原始长度的1.5倍。 输出
- 木棍中心的偏移距离(单位:毫米),保留到小数点后第三位。 样例输入
-
1000 100 0.0001
样例输出
-
61.329
代码
#include<cstdio>
#include<cmath>
double L,n,c,b,b1,l,r,R,hd;
int main()
{
scanf("%lf %lf %lf",&L,&n,&c);
b=(1+n*c)*L;L/=2;b/=2;//计算出膨胀后的木棍
l=0;r=L;/*膨胀的偏移距离最小为0,最大本为1.5*L,
但取略大值L/2*π,所以最大值取L/2,L已经平分*/
while(l+1e-4<=r)//循环条件,注意精度值(保留到小数点后第三位)
{
double mid=(l+r)/2;
R=(L*L+mid*mid)/(2*mid);//勾股定理化简(R-mid)²+L²=R²
hd=asin(L/R);//计算弧度,正弦定理
b1=hd*R;//弧长计算公式
if(b1<b) l=mid;//如果小于,证明取值偏小,修改边界
else r=mid;
}
printf("%.3lf",l);
}
思路最开始我看到这道题时,一脸懵逼,什么?经过同学和老师的讲解,渐渐明白思路。1.了解清楚弧长计算公式2.设偏移距离为x,用勾股定理计算半径,算出弧长3.判断弧长与实际的偏差,调整边界最后,做出来啦~~~*写博客的字体真不好调整,习惯了就会好些吧?*