高等数学
定积分
求出第一象限交集面积的四倍
交集面积等于两部分面积相加
每一部分分别对应一个椭圆函数
积分限分别问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); } }