HDU 1724 Ellipse——自适应simpson积分

题意:对于椭圆x^2/a^2+y^2/b^2 = 1(a,b已知),给定l,r,做直线x=l与x=r,求两直线之间的椭圆部分的面积。

思路:正常积分不可积,考虑求近似解,即利用simpson积分求解。

公式:∫(a->b)f(x)dx = (b-a)/6*(f(a)+4*f((a+b)/2)+f(b))

注意精度要到1e-10

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

const double eps = 1e-10;
const double pi = acos(-1.0);
double a, b;

int dcmp(double x) {
    if (fabs(x) < eps) return 0;
    else return (x > 0 ? 1 : -1);
}
double f(double x) {
    return b*sqrt(1-x*x/(a*a));
}
double cal(double l, double r) {
    return (r-l)/6.0*(f(l)+f(r)+4.0*f((l+r)/2));
}
bool judge(double l, double r) {
    if(dcmp(cal(l, (l+r)/2) + cal((l+r)/2, r) - cal(l, r)) == 0) return true;
    else return false;
}
double dfs(double l, double r) {
    if (judge(l, r)) return cal(l, r);
    return dfs(l, (l+r)/2.0) + dfs((l+r)/2.0, r);
}

int main() {
    int n;
    double l, r;
    scanf("%d", &n);
    for (int kase = 1; kase <= n; kase++) {
        scanf("%lf%lf%lf%lf", &a, &b, &l, &r);
        printf("%.3f\n", 2.0*dfs(l, r));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hao_zong_yin/article/details/80900000