hdu 1724 : Ellipse 【Simpson积分】

题目链接

题意:给出椭圆方程中的a和b,再给出l、r,求l到r的积分的二倍。

输出时要求精度控制为保留到小数点后3位,如下代码中,eps设为1e-9 1e-8时均TLE,1e-4可以AC,1e-3会WA

代码:

#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';
    }
}

 

posted @ 2018-06-28 17:01 wy_2016 阅读(...) 评论(...) 编辑 收藏