POJ 1905 Expanding Rods(二分)

Description
下图中线段长度为L,上边圆弧长度为L’=(1+n * C) * L,问圆弧最高点到线段的距离
这里写图片描述
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<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值