zoukankan      html  css  js  c++  java
  • [HDU1724]Ellipse

    题目:Ellipse

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1724

    题目简述:给定一个椭圆,求椭圆上一个区间[l,r]的面积。

    分析:

     (1)椭圆方程式:$frac{x^2}{a^2}+frac{y^2}{b^2}=1$。

     (2)椭圆上[l,r]区间的面积由X轴上方与X轴下方2部分组成,由于两部分面积一样,我们只考虑X轴上方的那部分面积。

     (3)椭圆上y关于x的变化函数:$y=f(x)=frac{b}{a}*sqrt{a^2-x^2}$

     (4)椭圆上表达式:$S=2*int_l^r{f(x)dx}=2*int_l^r{frac{b}{a}*sqrt{a^2-x^2} dx}$

     (5)算法一:用自适应希普森积分法:

     (6)算法二:数学好的可以计算这个积分式,然后直接用。

    代码:

    #include <cstdio>
    #include <cmath>
    const double eps=1e-10;
    double a,b;
    double F(double x){
        return sqrt(a*a-x*x);
    }
    double Simpson(double l,double r){
        return (r-l)*(F(l)+4*F((l+r)/2)+F(r))/6;
    }
    double Integral(double l,double r,double S){
        double mid=(l+r)/2;
        double A=Simpson(l,mid);
        double B=Simpson(mid,r);
        if(A+B-S<eps)return S;
        return Integral(l,mid,A)+Integral(mid,r,B);
    }
    int main(){
        int Case;scanf("%d",&Case);
        for(double l,r,S;Case--;){
            scanf("%lf %lf %lf %lf",&a,&b,&l,&r);
            S=2*b/a*Integral(l,r,Simpson(l,r));
            printf("%.3f
    ",S);
        }
        return 0;
    } 
    #include<cstdio>
    #include<cmath> 
    double a,b,l,r;
    double F(double x){
        double t=asin(x/a);
        return 0.5*a*b*(t+0.5*sin(2*t));
    }
    int main(){
        int Case;scanf("%d",&Case);
        for(;Case--;){
            scanf("%lf%lf%lf%lf",&a,&b,&l,&r);  
            printf("%.3lf
    ",2*(F(r)-F(l))); 
        }
        return 0;  
    }  
  • 相关阅读:
    操作技巧——电脑远程控制
    软件安装——internal error2503/2502
    系统常识——虚拟内存地址
    操作技巧——保障无线上网的技巧
    操作技巧——输入法转换问题
    软件安装——彻底卸载MySQL
    Java——this
    python百度贴吧爬虫
    糗事百科python爬虫
    python请求带cookie
  • 原文地址:https://www.cnblogs.com/hjj1871984569/p/6663449.html
Copyright © 2011-2022 走看看