首页 > 其他 > 详细

HDU 1724 Ellipse ——Simpson积分

时间:2017-02-01 20:43:22      阅读:100      评论:0      收藏:0      [点我收藏+]

【题目分析】

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

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

    用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));
	}
}

  

HDU 1724 Ellipse ——Simpson积分

原文:http://www.cnblogs.com/SfailSth/p/6360268.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!