洛谷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}(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范围内。
虽然是个黄题,但是结构体学好了一次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; }