POJ 1905 Expanding Rods解題報告(二分)

828 ワード

熱膨張後の弧の高さを求めます.
問題解決報告:二分は考えやすいが、数学の公式感覚こそ難点だ.実は私はずっと次のコードの精度の問題を疑っています.長さの変化が非常に小さい場合,rは無限大になり,精度に影響を及ぼすに違いない.コードが多すぎて、私は何も言わなかった......
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const double eps=1e-5;

int main()
{
    double L,h,c;
    double s;
    while(scanf("%lf%lf%lf",&L,&h,&c))
    {
        if(L<0 && h<0 && c<0)
            break;
        s=L*(1+h*c);

        L/=2;
        double l=0;
        double r=L;

        while(r-l>eps)
        {
            double mid=(l+r)/2;

            double rr=(L*L+mid*mid)/(2*mid);

            if(2*rr*asin(L/rr)<s)
                l=mid;
            else
                r=mid;
        }
        printf("%.3lf
",l); } }