洛谷p5143攀爬者

题目背景

HKE考完GDOI之后跟他的神犇小伙伴们一起去爬山。

题目描述

他在地形图上标记了NN个点,每个点Pi都有一个坐标(x_i,y_i,z_i)(xi,yi,zi)。所有点对中,高度值zz不会相等。HKE准备从最低的点爬到最高的点,他的攀爬满足以下条件:

(1) 经过他标记的每一个点;

(2) 从第二个点开始,他经过的每一个点高度zz都比上一个点高;

(3) HKE会飞,他从一个点Pi爬到Pj的距离为两个点的欧几里得距离。即,sqrt{(X_i-X_j)^2+(Y_i-Y_j)^2+(Z_i-Z_j)^2}(XiXj)2+(YiYj)2+(ZiZj)2

现在,HKE希望你能求出他攀爬的总距离。

输入格式

第一行,一个整数NN表示地图上的点数。

接下来N行,三个整数x_i,y_i,z_ixi,yi,zi表示第ii个点的坐标。

输出格式

一个实数,表示HKE需要攀爬的总距离(保留三位小数)

输入输出样例

输入 #1
5
2 2 2
1 1 1
4 4 4
3 3 3
5 5 5
输出 #1
6.928

说明/提示

对于100%的数据,1leq Nleq 500001N50000,答案的范围在double范围内。

虽然是个黄题,但是结构体学好了一次ac,本题只需排序结构体就行。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct fuck
{
    int x,y,z;
}a[100005];
bool cmp(fuck a,fuck b)
{
    if(a.z<b.z)
    {
        return true;
    }
    else
    {
        return false;
    }
}
int main()
{
    int n;
    double ans;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].x>>a[i].y>>a[i].z;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n-1;i++)
    {
        ans+=sqrt((a[i+1].x-a[i].x)*(a[i+1].x-a[i].x)+(a[i+1].y-a[i].y)*(a[i+1].y-a[i].y)+(a[i+1].z-a[i].z)*(a[i+1].z-a[i].z));
    }
    printf("%.3lf",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/lizhengde/p/13246025.html