1 条题解
-
0
解题思路
-
输入处理:
- 读取海岸线顶点数和最大允许长度
- 存储所有顶点坐标到
vector<Point>
中
-
核心算法:
- 双重循环枚举所有顶点对()
- 快速剪枝:
- 当方向距离时直接跳出内层循环(利用的性质)
- 使用距离平方比较避免耗时的开方运算()
- 面积估算剪枝:
- 计算当前顶点对可能的最大理论面积
- 若小于已得最大面积则跳过
-
面积计算:
- 对合法顶点对,通过三角形累加法计算封闭区域面积:$$\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)| $$
-
输出控制:
- 使用
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
- 上传者