1.题目链接。问题就是在求红色部分的面积。我们可以把面积分为两个部分,交点左边的是三角形,交点右边的是椭圆。我们把交点求出来之后,左边直接三角形的面积公式,右边Simpson积分。完美解决。但是这里注意一下坐标的范围,就是(x,y)的取值范围,因为x>=a的,所以斜率一定存在,并且很重要的是y有可能是负数,所以在计算三角形的面积的时候需要加上一个绝对值。代码如下:
#include<bits/stdc++.h>
using namespace std;
#pragma warning(disable:4996)
const double eps = 1e-9;
double a, b, x, y;
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, &x, &y);
double k = y / x;
double x0 = sqrt(pow(a, 2)*pow(b, 2) / (pow(b, 2) + pow(a, 2)*pow(k, 2)));
double y0 = k * x0;
double s1 = abs(0.5*x0*y0);
double s2 = simpson(x0, a, eps);
double s = s1 + s2;
printf("%.2lf\n", s);
}
}