POJ 1905 Expanding Rods 二分加数学公式的推导

点击打开链接

题意:给你一个L长的细棒然后将他卡在两个板子之间进行加热 ,然后他会变成长度为

S=L*(1+n*c)的弧线棒 求出该弧线棒的中心比以前高出多少(H)
思路:
    已知 图可得 :
    R 为圆弧的半径   S为弧长  θ为弧度角 为半个弧长对应的角度大小
    H 为高出的长度
    ①R^2-L^2/4=(R-H)^2
    ②sinθ=L/2R;
    ③θ=S/2R;
    
    =>有①得到 R=H/2+L*L/(8*H);
    由②③得到 S=2*R*asin(L/(2*R));
    二分枚举H 可得到R 然后带入公式 得到S1

    判断S 是否等于S1 即可



SH:可以通过推导出公式来然后二分枚举公式右边的变量即可得到左边值


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#define PI acos(-1)
#define eps 0.00000001
using namespace std;
int main()
{
    double L,n,c;
    while(~scanf("%lf%lf%lf",&L,&n,&c))
    {
        if(L<0&&n<0&&c<0)
            break;
        double sum=L*(1+n*c);
        double low=0,high=sum;
        double mid,Max=0;
        while(low<high)     ///等价于low+eps<=high
        {
            mid=(low+high)/2;
           /// cout<<mid;
            double R=mid/2+L*L/(8*mid);
            double S=2*R*asin(L/(2*R));
            if(sum==S)
                break;
            if(sum>S)
                low=mid;
            else
                high=mid;
        }
        printf("%.3f\n",mid);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值