题意:
就是有一根细棒,加热之后就会膨胀,但它的高度不会超过原长的一半,让你求他的变化高度h!
思路:
数学问题和二分查找!经过计算可以求出,R=(L0^2+4*h^2)/(8*h);L1=2*R*arcsin(L0/(2*R))
可以用二分枚举h的值,计算出R和L1,与题目中的L1进行比较!!!!!
代码:
#include <stdio.h>
#include <iostream>
#include <iomanip>>
#include <math.h>
using namespace std;
int main()
{
double L0,L1,N,C;
double high,low,h,r,L2,esp=1E-6;
while (cin>>L0>>N>>C)
{
if(L0<0&&N<0&&C<0)
break;
L1=(1+N*C)*L0;
high=0.5*L0;
low=0.0;
while (high-low>esp)
{
h=(high+low)/2;
r=(L0*L0+4*h*h)/(8*h);
L2=2*r*asin(L0/(2*r));
if (L1<L2) high=h;
else low=h;
}
h=(high+low)/2;
cout<<fixed<<setprecision(3)<<h<<endl;
}
return 0;
}
心得:
貌似是第一次接触含有数学的问题!感觉困难!!!!此题是看了题解,自己始终卡在求值上,即数学问题不会分析!!以后要加强训练!!!!