1 条题解

  • 0
    @ 2025-4-8 14:32:34

    题意分析

    本题要求利用输入给定的两条射线(射线 OAOAOBOB)以及若干正方形,构造出一个封闭区域。区域的边界由角的两条边和正方形组成,其面积为由射线构成的三角形面积减去正方形所占的面积,目标是使被围成的区域面积最大。

    • 注意角由两条射线确定,其斜率分别为 k1=yaxak_1=\frac{y_a}{x_a}k2=ybxb.k_2=\frac{y_b}{x_b}.
      k1k_1k2k_2 的大小决定了两射线之间的夹角。

    解题思路

    1. 计算正方形面积

      • 首先求所有正方形边长的总和 tottot
      • 每个正方形在平面上的面积为其边长的平方,而题中正方形排列采用了“对角线”投影方法,其相当于对面积做了特殊计算,代码中计算 s22\frac{s^2}{2} 作为每个正方形的贡献面积,累加得到 ssumssum
    2. 确定三角形顶点
      设利用正方形堆积所获得的延伸量在两个方向分别与射线交于两点 (x3,y3)(x_3,y_3)(x4,y4)(x_4,y_4)。通过数学推导有:

      $$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. $$
    3. 计算由射线构成的三角形面积
      利用两点 (x3,y3)(x_3,y_3)(x4,y4)(x_4,y_4) 和原点 OO,可计算三角形面积为

      Area=x3y4x4y32.\text{Area}=\frac{|x_3y_4-x_4y_3|}{2}.
    4. 求最大封闭区域的面积
      最大面积应为上步所求三角形面积减去正方形总“占用”面积 ssumssum

    本题代码

    #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
    上传者