POJ 1905 Expanding Rods(二分)

Description
下图中线段长度为L,上边圆弧长度为L’=(1+n * C) * L,问圆弧最高点到线段的距离
POJ 1905 Expanding Rods(二分)_第1张图片
Input
多组用例,每组用例输入三个非负实数L,n,C,以三个负数结束输入
Output
输出圆弧最高点到线段的距离
Sample Input
1000 100 0.0001
15000 10 0.00006
10 0 0.001
-1 -1 -1
Sample Output
61.329
225.020
0.000
Solution
设圆弧最高点到线段距离为h,圆弧半径为R,圆弧对应的圆心角为2a,则有以下关系:
这里写图片描述
考虑h与Ra的关系,如果h变大,则对应的圆弧弧长变大,反之弧长变小,故弧长随h增大而增大,二分h,通过第一个等式得到R,通过第二个等式得到a,进而得到Ra的值,如果Ra>=L’/2,说明二分值过大,否则说明二分值过小
Code

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 1111
int main()
{
    double L,n,C;
    while(~scanf("%lf%lf%lf",&L,&n,&C),L>=0&&n>=0&&C>=0)
    {
        double LL=(1.0+n*C)*L;
        double l=0,r=0.5*L,h;
        int t=100;
        while(t--)
        {
            h=0.5*(l+r);
            double R=(L*L/4.0+h*h)/(2.0*h);
            double a=asin(L/(2.0*R));
            if(R*a>=0.5*LL)r=h;
            else l=h;
        }
        printf("%.3f\n",h);
    } 
    return 0;
}

你可能感兴趣的:(POJ,二分三分)