• HDU 1724 Ellipse ——Simpson积分


    【题目分析】

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

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

        用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
    ",simpson(l,r));
    	}
    }
    

      

  • 相关阅读:
    Big-data:Linux基础(04)--快捷键
    Big-data:Linux基础(03)
    Big-data:Linux基础(02)
    [mysql]删除和修改
    git使用两个异常处理
    jmeter函数使用以及json格式的后置处理器
    jmeter遇到中文不可见
    jmeter参数化
    GIT简易使用
    mysql基本语句(更新中)
  • 原文地址:https://www.cnblogs.com/SfailSth/p/6360268.html
Copyright © 2020-2023  润新知