POJ 1905 题解(二分+几何)

题面

传送门

分析

这里写图片描述
如图:已知AB=L,AB=L(1+nC),M为AB中点,N为圆上一点,且ON垂直于AB于M,求MN
设半径为R,AOM=θ(弧度),MN=x
则可列出方程组
{2Rθ=L(1+nc)(1)Rsinθ=L2(2)x=R(1cosθ)(3)
若求出θ便可以求出x,所以我们从 θ入手,尝试解上面的方程组
由(1)(2)式得 θsinθ=1+nC
本人数学不好,求不出上面的方程的解析解(如果有解析解可以在评论中指出)
于是采用二分的方法来近似求根
显然0<θπ2
由图知θ越大,1+nC
我们二分θ,设二分中点为mid,端点为[L,R]并计算midsinmid,若midsinmid>1+nC,则寻找更小的,R=mid.否则寻找更大的,L=mid

还有几个细节:
1.π一定要很精确,否则会WA
2.设定的二分误差要尽量小

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-11
#define pi 3.141592653589793
using namespace std;
double L,n,C,theta,x;
int main(){
    while(scanf("%lf %lf %lf",&L,&n,&C)!=EOF){
        if(L==n&&n==C&&C==-1) break;
        if(n*C==0){
            printf("0.000
");
            continue;
        } 
        double l=eps,r=pi/2;//用弧度表示角 
        while(fabs(l-r)>eps){
            double mid=(l+r)/2;
            double hu=mid/sin(mid);
            if(hu>1+n*C) r=mid;
            else l=mid;
        }
        theta=l;
        double R=L/(2*sin(theta));
        printf("%.3f
",R*(1-cos(theta)));
    } 
} 
原文地址:https://www.cnblogs.com/birchtree/p/9845834.html