ACdream 同心树: 给定两个边长为L的正方形,以及旋转角∠O = a, 求重合部分面积.
解题思路:可以先求出三角形ABC的面积S, 再令L*L - 4 * S即可。
对三角形ABE 和三角形ODE, 有 ∠ABE = ∠ODE = 45度, ∠AEB = ∠OED ==> ∠BAE = ∠O = a.
对三角形,令 BC = x, AB = y, 则AC = L - x - y . 又因为∠BAC = a, 所以由勾股定理和 tan(a) =x/y 可以求出x和有。
代码如下:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
const double PI = acos(-1);
int main()
{
int T;
double L, a;
double area, temp;
double x, y;
scanf("%d", &T);
while(T--)
{
scanf("%lf%lf", &L, &a);
area = L * L;
while(a >= 90)
a -= 90;
a = a * PI / 180;
if(a > 0) {
temp = tan(a);
y = L * ((1 + temp) - sqrt(1 + temp * temp)) / (2 * temp);
x = y * temp;
area -= 2 * x * y;
}
printf("%.2lf\n", area);
}
return 0;
}
大家可以参考 另外一位同学的解法 , 他只设一个变量,求解十分方便。我的要解一元二次方程组,会比较麻烦。
写这道题的题解,是因为又发现了自己一个知识遗漏点: double sin(double x) 里的 x 是弧度,而不是角度。