1 条题解

  • 0
    @ 2026-6-19 10:31:00

    📝 题目大意

    从原点 (0,0)(0,0) 出发,依次经过给定的 NN 个点,最后返回原点,求总欧几里得距离(代价)。允许 10610^{-6} 的误差。

    💡 解题思路

    1. 题目分析:题目本质是求 N+1N+1 段欧几里得距离之和——从原点出发到第 1 个点,依次到第 NN 个点,最后从第 NN 个点返回原点。数据范围 N2×105N \leq 2\times 10^5,坐标 Xi,Yi109|X_i|,|Y_i| \leq 10^9,直接计算即可。

    2. 算法推导:设 x[0]=0,y[0]=0x[0]=0, y[0]=0 表示原点。依次读入 NN 个点存入 x[1..N],y[1..N]x[1..N], y[1..N]。由于全局数组 x[N+1]x[N+1]y[N+1]y[N+1] 默认初始化为 00,恰好对应返回原点。遍历 ii11N+1N+1,每次累加 (xixi1)2+(yiyi1)2\sqrt{(x_i - x_{i-1})^2 + (y_i - y_{i-1})^2} 即可。使用 double 类型存储距离,sqrtpow 计算平方与开方。

    3. 边界与细节

      • 坐标范围Xi,Yi109|X_i|,|Y_i| \leq 10^9,平方后可达 101810^{18} 量级,double(约 15 位有效数字)足以精确表示,不会溢出。
      • N=0N=0 的情况:题目保证 N1N \geq 1,无需处理。
      • 精度要求:输出时保留 20 位小数(printf("%.20lf", ans)),确保误差在 10610^{-6} 以内。
      • 隐式边界x[0]y[0] 作为全局数组自动初始化为 00x[N+1]y[N+1] 同理,巧妙避开了对原点出发和返回的特殊处理。

    ⏱️ 复杂度分析

    • 时间复杂度:遍历 N+1N+1 段路径,每次计算一个平方和开根号,O(N)O(N)
    • 空间复杂度:仅存储 xxyy 两个长度为 200005200005 的数组,O(N)O(N)

    💻 标准代码 (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
    上传者