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\n");
            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\n",R*(1-cos(theta)));
    } 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章