题目来源:攀爬者 - 洛谷
今天是除夕夜,祝大家除夕快乐,新的一年继续和大家陪伴刷题,祝大家龙年大吉,万事顺意,也祝今年找工作的伙伴们,顺利找到心仪的岗位。
解题思路 :这道题其实还满简单的,用结构体+排序+数学。使用sort
函数和自定义比较函数对数组进行排序,根据每个点的z值从小到大排序。然后依次算欧几里得距离,求和就可以解决啦。
cpp
#include<iostream>
#include<algorithm>
#include <cmath>
using namespace std;
struct Climbs
{
int x, y, z;
}a[50000];
// 自定义比较函数,用于排序
bool cmp(Climbs a, Climbs b)
{
return a.z < b.z;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].x >> a[i].y >> a[i].z;
}
// 根据z值对点进行排序
sort(a, a + n, cmp);
// 计算总距离
double total_distance = 0;
for (int i = 1; i < n; i++)
{
double distance = sqrt(pow(a[i].x - a[i-1].x, 2) +
pow(a[i].y - a[i-1].y, 2) +
pow(a[i].z - a[i-1].z, 2));
total_distance += distance;
}
// 输出总距离,保留三位小数
printf("%.3f\n", total_distance);
return 0;
}
ps:记得保留三位小数喔,不然系统过不去~