hdu 1724 : Ellipse 【Simpson積分】

題目連接php

題意:給出橢圓方程中的a和b,再給出l、r,求l到r的積分的二倍。c++

輸出時要求精度控制爲保留到小數點後3位,以下代碼中,eps設爲1e-9 1e-8時均TLE,1e-4能夠AC,1e-3會WAspa

代碼:code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const double eps=1e-4;

int n;
double a,b,l,r;

double F(double x)
{
    return b*sqrt(1-x*x/a/a);
}

double simpson(double l,double r)
{
    double m=(l+r)/2;
    return (F(l)+4.0*F(m)+F(r))*(r-l)/6.0;
}

double asr(double l,double r,double eps,double A)
{
    double m=(l+r)/2;
    double L=simpson(l,m),R=simpson(m,r);
    if(fabs(L+R-A)<=15.0*eps) return L+R+(L+R-A)/15.0;
    return asr(l,m,eps/2,L)+asr(m,r,eps/2,R);
}

double asr(double l,double r,double eps)
{
    return asr(l,r,eps,simpson(l,r));
}

int main()
{
    cin>>n;
    while(n--)
    {
        cin>>a>>b>>l>>r;
        cout<<fixed<<setprecision(3)<<2*asr(l,r,eps)<<'\n';
    }
}
相關文章
相關標籤/搜索