1 条题解

  • 0
    @ 2025-8-24 22:07:35

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar gzj__
    喵||天生我菜必有用,千分散尽爆零来||互关见 www.luogu.me/paste/5lojcq2f 喵||可能会杀关,杀关后会用小号会回||请不要杀关我 谢谢喵

    搬运于2025-08-24 22:07:35,当前版本为作者最后更新于2025-08-11 10:12:39,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    解题思路:

    首先要确定经过这些点的先后顺序,因为必须从最低到最高依次经过,所以需要按高度对所有点进行排序;然后按照排好的顺序,计算每相邻两个点之间的直线距离,再把这些距离全部加起来,得到的就是总距离。

    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;
    }
    
    • 1

    信息

    ID
    2482
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者