首页 > 技术文章 > HDU 1724 Ellipse ——Simpson积分

SfailSth 2017-02-01 19:42 原文

【题目分析】

    一看题目,直接把椭圆积分起来就可以了嘛。

    然后发现椭圆比较难积分,还是算了吧。

    用Simpson积分硬上。

    大概就是用二次函数去拟合面积。

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
 
#include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
#define maxn 500005
#define eps 1e-8
#define db double
#define ll long long
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
 
void Finout()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    #endif
}
 
int Getint()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

db a,b,l,r;
int T;

db cal(db l,db r)
{
	db fl=2*sqrt((a*a*b*b-b*b*l*l)/(a*a)),fr=2*sqrt((a*a*b*b-b*b*r*r)/(a*a)),mid=(l+r)/2;
	db fm=2*sqrt((a*a*b*b-b*b*mid*mid)/(a*a));
	return ((r-l)/6)*(fl+fr+4*fm);
}

db simpson(db l,db r)
{
	db mid=(l+r)/2,s1=cal(l,r),s2=cal(l,mid)+cal(mid,r);
	if (s2-s1<=eps) return s2;
	else return simpson(l,mid)+simpson(mid,r); 
}

int main()
{
	Finout();
	T=Getint();
	while (T--)
	{
		scanf("%lf%lf%lf%lf",&a,&b,&l,&r);
		printf("%.3f\n",simpson(l,r));
	}
}

  

推荐阅读