GDUT_寒假训练题解报告_专题I_J题 个人题解报告
J题:浮点数二分
题目:
当长度为L的细杆被加热n度时,它会膨胀到新的长度L’=(1+n*C)*L,其中C是热膨胀系数。
当一根细杆被安装在两个固体壁上,然后被加热,它就会膨胀,形成一个圆形的节段,原来的节段的弦杆就是节段的弦杆。
你的任务是计算杆中心位移的距离。
输入
输入包含多行。每行输入包含三个非负数:棒的初始长度(毫米)、温度变化(度)和材料的热膨胀系数。输入数据保证没有杆的膨胀超过其原始长度的一半。最后一行输入包含三个负数,不应进行处理。
输出
对于每一行输入,输出一行,其中包含以毫米为单位的杆中心位移,精度为3位数。
从题目上来看,是一个L长的棒子,加热之后会有一个L`,然后求他拱高的高度,我们用物理知识不难得出,这个弧毕竟、定是一个圆弧,沿着两头切线开始处处受力平衡;
问题简化成:求一个弦长为L,对应弧长为L`的扇形,求它的 R-圆心到弦的垂线长度。
这个题目如果直接来做我们似乎找不到行之有效的方法,只有一大堆式子,但是要实现验证答案是否正确是可以做到的,我们使用对结果h二分:
每一个h对应一个R和扇形的角度Alpha:
上代码:
using namespace std;
double L,N,C;
int main()
{
while(~scanf("%lf %lf %lf",&L,&N,&C) && L>=0 && N>=0 && C>=0)
{
//h的范围:0——L/2;
double left=0,right=L/2;
double L1=(1+N*C)*L;
while(right-left>=1e-8)
{
double mid=left+(right-left)/2;
double R=mid/2+L*L/8/mid;
double Alpha=asin(L/(R*2));
if(L1>2.0*R*Alpha)
{//h小了,应该往上取
left=mid;
}
else right=mid;
}
printf("%.3f\n",left);
}
return 0;
}