洛谷:攀爬者(P5143,排序)

HKE考完GDOI之后跟他的神犇小伙伴们一起去爬山。题目描述他在地形图上标记了N个点,每个点Pi都有一个坐标(xi​,yi​,zi​)。所有点对中,高度值z不会相等。HKE准备从最低的点爬到最高的点,他的攀爬满足以下条件:(1) 经过他标记的每一个点;(2) 从第二个点开始,他经过的每一个点高度z都比上一个点高;(3) HKE会飞,他从一个点Pi爬到Pj的距离为两个点的欧几里得距离。​现在,HKE希望你能求出他攀爬的总距离。输入格式第一行,一个整数N表示地图上的点数。接下来N行,三个整数xi,yi,zi表示第i个点的坐标。输出格式一个实数,表示HKE需要攀爬的总距离(保留三位小数)
输入输出样例
输入
5
2 2 2
1 1 1
4 4 4
3 3 3
5 5 5
输出
6.928
说明/提示对于100%的数据,1≤N≤50000,答案的范围在double范围内。

#include
using namespace std;        //本题中攀爬从z小到大,所以用结构体储存坐标,根据z的大小排序依次攀爬记录距离即可
struct dis{
    int x;
    int y;
    int z;
};
bool cmp(dis a,dis b){        //sort中的比较方法,a的z小于b的z的话代表“小于”排前面
    return a.z<b.z;
}
int main(){
    int n;
    cin>>n;
    dis distance[n];
    for(int i=0;i<n;i++){
        cin>>distance[i].x>>distance[i].y>>distance[i].z;
    }
    sort(distance,distance+n,cmp);
    double ans=0;
    for(int i=0;i<n-1;i++){
        ans+=sqrt(pow(distance[i].x-distance[i+1].x,2)+pow(distance[i].y-distance[i+1].y,2)+pow(distance[i].z-distance[i+1].z,2));
    }
    cout<<fixed<<setprecision(3)<<ans;
    //system("pause");
    return 0;
}

你可能感兴趣的:(洛谷:攀爬者(P5143,排序))