题意:将长度为L的棒子卡在墙壁之间。现在因为某种原因,木棒变长了,因为还在墙壁之间,所以弯成了一个弧度,现在求的是弧的最高处与木棒原先的地方的最大距离。
分析:
下面的分析是网上别人的分析:
设弦长为L0(即原长),弧长为L1=(1+n*C)*l0,目标值为h,半径为R,弧所对圆心角为2θ(弧度制)。
可以得到以下方程组:
圆的弧长公式:L1=2θR
三角函数公式:L0=2*R*sinθ,变换得θ=arcsin(L0/(2*R))
勾股定理:R^2=(R-h)^2+(0.5*L0)^2,变换得L0^2+4*h^2=8*h*R
合并①②式得到
L1=2*R*arcsin(L0/(2*R))
半径R可以由③式变换得到
R=(L0^2+4*h^2)/(8*h)
可以用二分枚举h的值,计算出R和L1,与题目中L1进行比较。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
#define LL long long
using namespace std;
const double eps = 1e-; int main()
{
double l0, n, c, l1, l2, r;
double high, low, mid;
while(cin>>l0>>n>>c)
{
if(l0==-&&n==-&&c==-) break;
l1 = (+n*c)*l0;
low = ; high = 0.5*l0;
while(high-low>eps)
{
mid = (low+high)/;
r = (l0*l0 + *mid*mid)/(*mid);
l2 = *r*asin(l0/(*r));
if(l1 < l2) high = mid;
else low = mid;
}
mid = (low+high)/;
printf("%.3lf\n", mid);
}
return ;
}