他在地形图上标记了N个点,每个点Pi都有一个坐标(xi,yi,zi)。所有点对中,高度值z不会相等。HKE准备从最低的点爬到最高的点,他的攀爬满足以下条件:
(1) 经过他标记的每一个点;
(2) 从第二个点开始,他经过的每一个点高度z都比上一个点高;
(3) HKE会飞,他从一个点Pi爬到Pj的距离为两个点的欧几里得距离。即,
现在,HKE希望你能求出他攀爬的总距离。
输入格式:
第一行,一个整数N表示地图上的点数。
接下来N行,三个整数xi,yi,zi表示第i个点的坐标。
输出格式:
一个实数,表示HKE需要攀爬的总距离(保留三位小数)
输入样例#1:
5
2 2 2
1 1 1
4 4 4
3 3 3
5 5 5
输出样例#1:
6.928
解题思路:
直接把所有点按Z排序,再把排序后相邻两点的距离加起来即可
代码:
var
a:array[0..50000,1..3]of extended;
i,j,n:longint;
ans:extended;
procedure qsort(l,r:longint);
var
i,j:longint;
t:extended;
begin
i:=l;j:=r;
t:=a[(l+r)div 2,3];
repeat
while (a[i,3]<t)and(i>0) do inc(i);
while (a[j,3]>t)and(j<=n) do dec(j);
if i<=j then begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
inc(i);dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
begin
readln(n);
for i:=1 to n do
readln(a[i,1],a[i,2],a[i,3]);
qsort(1,n);
for i:=2 to n do
ans:=ans+sqrt(sqr(a[i,1]-a[i-1,1])+sqr(a[i,2]-a[i-1,2])+sqr(a[i,3]-a[i-1,3]));
writeln(ans:0:3);
end.