题目背景
HKE考完GDOI之后跟他的神犇小伙伴们一起去爬山。
题目描述
他在地形图上标记了NN个点,每个点Pi都有一个坐标(xi,yi,zi)。所有点对中,高度值z不会相等。HKE准备从最低的点爬到最高的点,他的攀爬满足以下条件:
(1) 经过他标记的每一个点;
(2) 从第二个点开始,他经过的每一个点高度z都比上一个点高;
(3) HKE会飞,他从一个点Pi爬到Pj的距离为两个点的欧几里得距离。即,
现在,HKE希望你能求出他攀爬的总距离。
输入格式
第一行,一个整数N表示地图上的点数。
接下来N行,三个整数x*i,yi,zi表示第*i个点的坐标。
输出格式
一个实数,表示HKE需要攀爬的总距离(保留三位小数)
说明/提示
对于100%的数据,1≤N≤50000,答案的范围在double范围内。
代码
#include <algorithm>
#include <iostream>
#include <math.h> //得以使用pow函数
#include <stdio.h>
using namespace std;
const int maxn = 50005;
struct node {
double x, y, z;
};
bool cmp(node a, node b)
{
return a.z < b.z;
}
node arr[maxn];
int main()
{
int n; //地图上的点数
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> arr[i].x >> arr[i].y >> arr[i].z;
}
sort(arr + 1, arr + 1 + n, cmp);
double ans = 0;
for (int i = 1; i < n; i++)
{
ans += sqrt(pow(arr[i].x - arr[i + 1].x, 2) + pow(arr[i].y - arr[i + 1].y, 2) + pow(arr[i].z - arr[i + 1].z, 2));
}
printf("%.3lf", ans);
}