题目:【POJ】 1905 Expanding Rods
题目链接:http://poj.org/problem?id=1905
题目描述:给出了弧长和弦长,求拱高。
题目分析:这题对圆的几何知识比较高(熟练度),要通过半径和圆心角这两个中间量使弦长和弧长进行联系。可以对其中的某个量,进行二分,前题是要单调。以下笔者对k=(1+C*n)(弧长和弦长的比)进行二分。附上一个不完整的推导
(如果有错,快告诉我,我也想知道怎么证)
代码:
#include <stdio.h>
#include <math.h>
int main()
{
double L0,c,n,a,a1,a0,t,k,s;
while(1)
{
scanf("%lf%lf%lf",&L0,&c,&n);
if(L0<0) break;
if(!(c&&n)) {printf("0.000\n");continue;}
t=(1+c*n); //记录标准值
a=a1=4; //上限3.?,取整吧
a0=0;
while(a1-a0>1e-10) //这个二分精度要求比较高
{
k=a/(2*sin(a/2));
if(k>t) {a1=a;a=(a1+a0)/2;}
else if(k<t){a0=a;a=(a1+a0)/2;}
else break;
}
s=L0*(t/a-sqrt(t*t/(a*a)-0.25));//由得出的圆心角,算高
printf("%.3lf\n",s);
}
return 0;
}