1 条题解
-
0
📝 题目大意
从原点 出发,依次经过给定的 个点,最后返回原点,求总欧几里得距离(代价)。允许 的误差。
💡 解题思路
-
题目分析:题目本质是求 段欧几里得距离之和——从原点出发到第 1 个点,依次到第 个点,最后从第 个点返回原点。数据范围 ,坐标 ,直接计算即可。
-
算法推导:设 表示原点。依次读入 个点存入 。由于全局数组 和 默认初始化为 ,恰好对应返回原点。遍历 从 到 ,每次累加 即可。使用
double类型存储距离,sqrt和pow计算平方与开方。 -
边界与细节:
- 坐标范围:,平方后可达 量级,
double(约 15 位有效数字)足以精确表示,不会溢出。 - 的情况:题目保证 ,无需处理。
- 精度要求:输出时保留 20 位小数(
printf("%.20lf", ans)),确保误差在 以内。 - 隐式边界:
x[0]和y[0]作为全局数组自动初始化为 ,x[N+1]和y[N+1]同理,巧妙避开了对原点出发和返回的特殊处理。
- 坐标范围:,平方后可达 量级,
⏱️ 复杂度分析
- 时间复杂度:遍历 段路径,每次计算一个平方和开根号,。
- 空间复杂度:仅存储 和 两个长度为 的数组,。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; int n, x[200005], y[200005]; // x[0] 和 y[0] 自动初始化为 0,表示原点 double ans; int main () { scanf("%d", &n); // 读入 N 个点的坐标,下标从 1 开始 for (int i = 1; i <= n; i++) scanf("%d%d", &x[i], &y[i]); // 从原点到第 1 个点,依次到第 N 个点,最后回到原点 (x[N+1]=y[N+1]=0) for (int i = 1; i <= n + 1; i++) { ans += sqrt(1.0 * pow(x[i] - x[i - 1], 2) + 1.0 * pow(y[i] - y[i - 1], 2)); } printf("%.20lf", ans); // 输出 20 位小数,满足精度要求 return 0; } -
- 1
信息
- ID
- 832
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 2
- 上传者