题解:P5143 攀爬者
解题思路:
首先要确定经过这些点的先后顺序,因为必须从最低到最高依次经过,所以需要按高度对所有点进行排序;然后按照排好的顺序,计算每相邻两个点之间的直线距离,再把这些距离全部加起来,得到的就是总距离。
AC Code:
#include<bits/stdc++.h>
using namespace std;
// 定义结构体node,用于存储三维空间中点的坐标信息
struct node{
int x,y,z; //分别表示点的x坐标、y坐标和z坐标(高度)
}p[50000]; //声明一个node类型的数组p,最多可存储50000个点
//定义比较函数cmp,用于排序时按照点的z坐标(高度)从小到大排序
bool cmp(node a,node b){
return a.z<b.z; //当a的z值小于b的z值时,a排在b前面
}
int main(){
int n; //声明变量n,用于存储点的数量
cin>>n; //从标准输入读取点的数量n
//循环读取n个点的坐标信息,存储到数组p中
for(int i=0;i<n;i++)
cin>>p[i].x>>p[i].y>>p[i].z; //依次读取每个点的x、y、z坐标
// 对数组p中的n个点按照z坐标从小到大进行排序
sort(p,p+n,cmp);
double s=0; //双精度浮点型变量s,用于累加总距离,初始值为0
//循环计算排序后相邻两个点之间的距离,并累加到s中
for(int i=1;i<n;i++){
//计算当前点与前一个点在x方向上的差值
double dx=p[i].x-p[i-1].x;
//计算当前点与前一个点在y方向上的差值
double dy=p[i].y-p[i-1].y;
//计算当前点与前一个点在z方向上的差值
double dz=p[i].z-p[i-1].z;
//根据三维空间两点间距离公式计算距离,并累加到总距离s中
s+=sqrt(dx*dx+dy*dy+dz*dz);
}
//输出总距离,保留3位小数
cout<<fixed<<setprecision(3)<<s<<endl;
return 0;
}