题目背景
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}(Xi−Xj)2+(Yi−Yj)2+(Zi−Zj)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%的数据,1\leq N\leq 500001≤N≤50000,答案的范围在double范围内。
分析:
这题真的不难,自从上一次学会了结构体排序之后,sort用的更加得心应手了,但是博主试了好多次才AC,因为我把最后的n的范围50000看成了5000......希望其他小伙伴不要犯和博主一样愚蠢的错误QAQ
上AC代码
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
using namespace std;
typedef struct Point{
int x;
int y;
int z;
}point;
point p[50005];
int n;
bool cmp(Point p1,Point p2);
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i].x>>p[i].y>>p[i].z;
sort(p+1,p+n+1,cmp);
double dis;
for(int i=1;i<n;i++)
{
//double tempx=(p[i].x-p[i+1].x)*(p[i].x-p[i+1].x);
//double tempy=(p[i].y-p[i+1].y)*(p[i].y-p[i+1].y);
//double tempz=(p[i].z-p[i+1].z)*(p[i].z-p[i+1].z);
//double temp=tempx+tempy+tempz;
double tempdis=sqrt((p[i].x-p[i+1].x)*(p[i].x-p[i+1].x)+(p[i].y-p[i+1].y)*(p[i].y-p[i+1].y)+(p[i].z-p[i+1].z)*(p[i].z-p[i+1].z));
//double tempdis=sqrt(temp);
dis+=tempdis;
}
printf("%.3lf",dis);
return 0;
}
bool cmp(Point p1,Point p2)
{
if(p1.z<p2.z)
return true;
else
return false;
}