1 条题解
-
0
题意分析
本题要求利用输入给定的两条射线(射线 和 )以及若干正方形,构造出一个封闭区域。区域的边界由角的两条边和正方形组成,其面积为由射线构成的三角形面积减去正方形所占的面积,目标是使被围成的区域面积最大。
- 注意角由两条射线确定,其斜率分别为 和
和 的大小决定了两射线之间的夹角。
解题思路
-
计算正方形面积
- 首先求所有正方形边长的总和 。
- 每个正方形在平面上的面积为其边长的平方,而题中正方形排列采用了“对角线”投影方法,其相当于对面积做了特殊计算,代码中计算 作为每个正方形的贡献面积,累加得到 。
-
确定三角形顶点
$$x_3=\frac{tot(1+k_1)}{k_1-k_2},\quad y_3=x_3\cdot k_1, $$$$x_4=\frac{tot(1+k_2)}{k_1-k_2},\quad y_4=x_4\cdot k_2. $$
设利用正方形堆积所获得的延伸量在两个方向分别与射线交于两点 和 。通过数学推导有: -
计算由射线构成的三角形面积
利用两点 与 和原点 ,可计算三角形面积为 -
求最大封闭区域的面积
最大面积应为上步所求三角形面积减去正方形总“占用”面积 。
本题代码
#include <cstdio> #include <cmath> #include <iostream> using namespace std; const int maxn = 600; double sqa[maxn]; int main() { int n; while (scanf("%d", &n) && n) { double x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; double tot = 0, ssum = 0; double k1 = y1 / x1, k2 = y2 / x2; for (int i = 0; i < n; i++) { cin >> sqa[i]; tot += sqa[i]; ssum += sqa[i] * sqa[i] / 2.0; } double x3 = tot * (1.0 + k1) / (k1 - k2); double y3 = x3 * k1; double x4 = tot * (1.0 + k2) / (k1 - k2); double y4 = x4 * k2; double area = fabs(x3 * y4 - x4 * y3) / 2.0; printf("%.3lf\n", area - ssum); } return 0; }
- 注意角由两条射线确定,其斜率分别为 和
- 1
信息
- ID
- 1722
- 时间
- 2000ms
- 内存
- 64MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者