题目描述
他在地形图上标记了 N个点,每个点Pi 都有一个坐标 (xi,yi,zi)。所有点对中,高度值 z 不会相等。HKE 准备从最低的点爬到最高的点,他的攀爬满足以下条件:
(1) 经过他标记的每一个点;
(2) 从第二个点开始,他经过的每一个点高度 zz 都比上一个点高;
(3) HKE 会飞,他从一个点Pi 爬到 Pj 的距离为两个点的欧几里得距离。即,$\sqrt{(X_i-X_j)^2+(Y_i-Y_j)^2+(Z_i-Z_j)^2}$
输入格式
第一行,一个整数 NN 表示地图上的点数。
接下来 N 行,三个整数 xi,yi,zi 表示第 i 个点的坐标。
输出格式
一个实数,表示 HKE 需要攀爬的总距离(保留三位小数)
分析:
根据题意,创建一个结构体,按照点的大小进行排序,然后根据欧几里得距离公式计算高度,将高度加在一起。
代码:
#include<bits/stdc++.h>
using namespace std;
struct zb
{
int x;
int y;
int z;
}g[50001];
bool paixu(zb a, zb b)
{
return a.z < b.z;
}
int main() {
int n,nx,ny,nz;
double hke=0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> g[i].x >> g[i].y >> g[i].z;
}
sort(g+1,g+1+n,paixu);
nx = g[1].x;
ny = g[1].y;
nz = g[1].z;
for (int i = 2; i <= n; i++) {
hke += sqrt((nx - g[i].x) * (nx - g[i].x) + (ny - g[i].y) * (ny - g[i].y) + (nz - g[i].z) * (nz - g[i].z));
nx = g[i].x;
ny = g[i].y;
nz = g[i].z;
}
cout << setiosflags(ios::fixed) << setprecision(3) << hke;
return 0;
}