洛谷-P5143 攀爬者

洛谷-P5143 攀爬者

原题链接:https://www.luogu.com.cn/problem/P5143


题目背景

HKE考完GDOI之后跟他的神犇小伙伴们一起去爬山。

题目描述

他在地形图上标记了\(N\)个点,每个点Pi都有一个坐标\((x_i,y_i,z_i)\)。所有点对中,高度值\(z\)不会相等。HKE准备从最低的点爬到最高的点,他的攀爬满足以下条件:

(1) 经过他标记的每一个点;

(2) 从第二个点开始,他经过的每一个点高度\(z\)都比上一个点高;

(3) HKE会飞,他从一个点Pi爬到Pj的距离为两个点的欧几里得距离。即,\(\sqrt{(X_i-X_j)^2+(Y_i-Y_j)^2+(Z_i-Z_j)^2}\)

现在,HKE希望你能求出他攀爬的总距离。

输入格式

第一行,一个整数\(N\)表示地图上的点数。

接下来N行,三个整数\(x_i,y_i,z_i\)表示第\(i\)个点的坐标。

输出格式

一个实数,表示HKE需要攀爬的总距离(保留三位小数)

输入输出样例

输入 #1

5
2 2 2
1 1 1
4 4 4
3 3 3
5 5 5

输出 #1

6.928

说明/提示

对于100%的数据,\(1\leq N\leq 50000\),答案的范围在double范围内。

C++代码

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

struct node {
    int x, y, z;
}p[50000];

bool cmp(node a, node b) {
    return a.z < b.z;
}

double dist(node a, node b) {
    return sqrt(pow(a.x-b.x, 2) + pow(a.y-b.y, 2) + pow(a.z-b.z, 2));
}

int main() {
    int n;
    double ans = 0;
    scanf("%d", &n);
    for (int i=0; i<n; ++i)
        scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].z);
    sort(p, p+n, cmp);
    for (int i=1; i<n; ++i)
        ans += dist(p[i-1], p[i]);
    printf("%.3f\n", ans);
    return 0;
}
posted @ 2020-08-17 09:10  yuzec  阅读(283)  评论(0编辑  收藏  举报