zoukankan      html  css  js  c++  java
  • 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)));
        } 
    } 
    
  • 相关阅读:
    【springcloud alibaba】配置中心之nacos
    【springcloud alibaba】注册中心之nacos
    LeetCode计数质数Swift
    LeetCode移除链表元素Swift
    LeetCode删除重复的电子邮箱SQL
    LeetCode汉明距离Swift
    LeetCode两整数之和Swift
    LeetCode从不订购的客户SQL
    LeetCode超过经理收入的员工SQL
    LeetCode组合两个表SQL
  • 原文地址:https://www.cnblogs.com/birchtree/p/9845834.html
Copyright © 2011-2022 走看看