pku 1905 二分 Expanding Rods 解题报告
解题思路:
由公式 弦长 = 2*r*sin(弧长/2*r)
即b=2*r * sin(a / (2r)), a为弧长,b为弦长
即b/a=2r/a*sin(a/(2r))
角a/2r相当于a*pi / 2r*pi 即弧角=弧度=弧长/半径
推理可知范围在0~pi/2 假设为x=a/(2r),即为弧长一半所对应的圆心角
即b/a=sinx/x
在弦长一半b/2与所求高度result所围成的直角三角形中,由正弦定理得: sin(y)/result=sin(z)/(b/2) ,其中y =(pi-x)/2-(pi/2-x),z=(pi-x)/2
化简为: result=(1 - cos(x)) * b / (2 * sin(x))
AC代码:
#include <cmath>
#include <iostream>
using namespace std;
const double eop = 1e-12;
const double pi = acos(0.0);
int main()
{
//freopen("1.txt", "r", stdin);
//freopen("2.txt", "w", stdout);
double l, n, c;
while (scanf("%lf%lf%lf", &l, &n, &c))
{
if (l == -1 && n == -1 && c == -1)
{
break;
}
double b, a;
b = l;
a = (1 + n * c) * b;
double low, high, mid;
low = 0;
high = pi;
while (low + eop < high)
{
mid = (high + low) / 2.0;
if (sin(mid) / mid > b / a)
{
low = mid;
}
else
{
high = mid;
}
}
printf("%.3lf/n", (1 - cos(high)) * b / (2 * sin(high)) );
}
return 0;
}