POJ 1905 题解(二分+几何)

5 篇文章 0 订阅
2 篇文章 0 订阅

题面

传送门

分析

这里写图片描述
如图:已知 AB=L,AB=L(1+nC) A B = L , 弧 A B = L ( 1 + n C ) ,M为AB中点,N为圆上一点,且ON垂直于AB于M,求MN
设半径为 R R ,AOM=θ(弧度), MN=x M N = x
则可列出方程组
2Rθ=L(1+nc)(1)Rsinθ=L2(2)x=R(1cosθ)(3) { 2 R θ = L ( 1 + n c ) ( 1 ) R sin ⁡ θ = L 2 ( 2 ) x = R ( 1 − cos ⁡ θ ) ( 3 )
若求出 θ θ 便可以求出x,所以我们从 θ θ 入手,尝试解上面的方程组
由(1)(2)式得 θsinθ=1+nC θ sin ⁡ θ = 1 + n C
本人数学不好,求不出上面的方程的解析解(如果有解析解可以在评论中指出)
于是采用二分的方法来近似求根
显然 0<θπ2 0 < θ ≤ π 2
由图知 θ θ 越大, 1+nC 1 + n C 越 大
我们二分 θ θ ,设二分中点为mid,端点为[L,R]并计算 midsinmid m i d sin ⁡ m i d ,若 midsinmid>1+nC m i d sin ⁡ m i d > 1 + n C ,则寻找更小的,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)));
    } 
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值