洛谷-P5143 攀爬者
洛谷-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;
}