天天看點

【HDU1724】自适應Simpson積分

1.​​題目連結​​。題目的意思很簡單,就是求陰影部分的面積,圖形是一個橢圓。

//#include"stdafx.h"
//#include<iostream>
//#include<cmath>
//using namespace std;
//#pragma warning(disable:4996)
//int main()
//{
//  int T;
//  scanf("%d", &T);
//  int a, b, l, r;
//  while (T--)
//  {
//    scanf("%d%d%d%d", &a, &b, &l, &r);
//    if (l == r)
//    {
//      cout << "0.00" << endl;
//      continue;
//
//    }
//    double ly = sqrt(pow(a, 2) - pow(l, 2));
//    double ry = sqrt(pow(a, 2) - pow(r, 2));
//    double dis = sqrt(pow(l - r, 2) + pow(ly - ry, 2));
//    double csita = (2 * pow(a, 2) - pow(dis, 2))*1.0 / (2 * a*a);
//    double sita = acos(csita);
//    double s1 = a * a*sita / 2;
//    double s2 = abs(l)*sqrt(pow(a, 2) - pow(l, 2)) / 2;
//    double s3 = abs(r)*sqrt(pow(a, 2) - pow(r, 2)) / 2;
//    double s = s1 + s2 + s3;
//    s *= 2;
//    s = s * (b*1.0 / a);
//    printf("%.4lf\n", s);
//  }
//}

#include"stdafx.h"
#include<iostream>
using  namespace std;
const double eps = 1e-9;
#pragma warning(disable:4996)
//f函數
double a, b, l, r;
double f(double x)
{
  return sqrt((1 - x * x / (a*a))*(b*b));
}
//Simpson公式
double simpson(double l, double r)
{
  return (f(l) + 4 * f((l + r) / 2) + f(r))*(r - l) / 6;
}
double simpson(double l, double r,double all,double eps)
{
  double mid = (l + r) / 2;
  double L = simpson(l, mid);
  double R = simpson(mid, r);
  if (fabs(L + R - all) <= 15 * eps)
    return L + R + (L + R - all) / 15;
  return simpson(l, mid, L, eps / 2) + simpson(mid, r, R, eps / 2);
}
double simpson(double l, double r, double eps)
{
  return simpson(l, r, simpson(l, r), eps);
}
int main()
{
  int T;
  scanf("%d", &T);
  while (T--)
  {
    scanf("%lf%lf%lf%lf", &a, &b, &l, &r);
    printf("%.3lf\n", 2*simpson(l, r,1e-4));
  }
  return 0;
}