1 条题解

  • 0
    @ 2025-5-28 9:53:54

    解题思路

    1. 输入处理

      • 读取海岸线顶点数NN和最大允许长度LL
      • 存储所有顶点坐标到vector<Point>
    2. 核心算法

      • 双重循环枚举所有顶点对(i,j)(i,j)i<ji < j
      • 快速剪枝
        • xx方向距离>L>L时直接跳出内层循环(利用xi<xi+1x_i < x_{i+1}的性质)
        • 使用距离平方比较避免耗时的开方运算(d2L2d^2 \leq L^2
      • 面积估算剪枝
        • 计算当前顶点对可能的最大理论面积0.5×L×Δx0.5 \times L \times \Delta x
        • 若小于已得最大面积则跳过
    3. 面积计算

      • 对合法顶点对,通过三角形累加法计算封闭区域面积:$$\text{Area} = \sum_{k=i+1}^{j-1} \text{triangleArea}(p_i, p_j, p_k) $$
      • 单个三角形面积用叉积公式计算:$$\text{triangleArea} = \frac{1}{2} |(p_i \times p_j + p_j \times p_k + p_k \times p_i)| $$
    4. 输出控制

      • 使用cout.precision(15)保证输出精度
      • 直接输出最大面积不做任何舍入
    #include <iostream> 
    #include <cmath> 
    #include <vector> 
     
    using namespace std; 
     
    // 定义点的结构体 
    struct Point { 
        int x, y; 
        Point(int _x, int _y) : x(_x), y(_y) {} 
    }; 
     
    // 计算两点之间的距离的平方(避免开方运算) 
    int distanceSquared(const Point& p1, const Point& p2) { 
        int dx = p2.x - p1.x; 
        int dy = p2.y - p1.y; 
        return dx * dx + dy * dy; 
    } 
     
    // 计算三角形的面积 
    double triangleArea(const Point& p1, const Point& p2, const Point& p3) { 
        return 0.5 * abs(p1.x * (p2.y - p3.y) + p2.x * (p3.y - p1.y) + p3.x * (p1.y - p2.y)); 
    } 
     
    // 计算由线段和海岸线围成的面积 
    double calculateArea(const vector<Point>& points, int i, int j) { 
        double area = 0; 
        for (int k = i + 1; k < j; ++k) { 
            area += triangleArea(points[i], points[j], points[k]); 
        } 
        return area; 
    } 
     
    int main() { 
        int N, L; 
        cin >> N >> L; 
     
        vector<Point> points; 
        for (int i = 0; i < N; ++i) { 
            int x, y; 
            cin >> x >> y; 
            points.push_back(Point(x,  y)); 
        } 
     
        double maxArea = 0; 
        int L_squared = L * L; 
     
        for (int i = 0; i < N; ++i) { 
            for (int j = i + 1; j < N; ++j) { 
                // 提前判断 x 方向距离是否超过 L 
                if (points[j].x - points[i].x > L) { 
                    break; 
                } 
                // 计算距离的平方,避免开方运算 
                int dist_squared = distanceSquared(points[i], points[j]); 
                if (dist_squared <= L_squared) { 
                    // 简单的提前终止判断:如果当前最大面积已经大于可能的最大面积,则跳过 
                    double possibleMaxArea = 0.5 * L * (points[j].x - points[i].x); 
                    if (possibleMaxArea <= maxArea) { 
                        continue; 
                    } 
                    double area = calculateArea(points, i, j); 
                    if (area > maxArea) { 
                        maxArea = area; 
                    } 
                } 
            } 
        } 
     
        cout.precision(15);  
        cout << maxArea << endl; 
     
        return 0; 
    }
    • 1

    信息

    ID
    1334
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者