高等数学
定积分
求出第一象限交集面积的四倍
交集面积等于两部分面积相加
每一部分分别对应一个椭圆函数
积分限分别问0-x0,x0-c
最后面积相加减去交集
包含情况特殊处理
本题精确度要求不高,数学方法便可轻松解决,打着算法题的幌子本质是一道高数题,时间复杂度O(1)
https://blog.csdn.net/qq_44378358/article/details/117410681?spm=1001.2014.3001.5501
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double PI = 3.1415926535;
/*
3
2 1 1 2
3 2 1 2
3 2 1 4
*/
int main(void) {
int t;
cin >> t;
while (t--) {
double a, b, c, d, ans = 0;
cin >> a >> b >> c >> d;
if (a > c && b > d) {
ans = PI * a * b;
} else if (c > a && d > b) {
ans = PI * c * d;
} else {
double x0 = sqrt((a*a * c*c * (b*b - d*d))/(b*b * c*c - a*a * d*d));
double s1 = 0.5 * a * b * (x0 / a) * sqrt(1 - x0*x0 / (a*a)) + 0.5 * a * b * (asin(x0 / a));
double s2 = PI * c * d / 4 - 0.5 * c * d * x0 / c * sqrt(1 - x0 * x0 / (c * c)) - 0.5 * c * d * asin(x0 / c);
ans = PI * a * b + PI * c * d - 4 * (s1 + s2);
}
printf("%.1f\n", ans);
}
} 
京公网安备 11010502036488号