原题链接
内心OS
第一眼看上去:
???三连,这么离谱的公式,这还是正常的橙题吗?
1分钟后······
这么简单的题,还好意思当橙题?
(请忽略上方内容)
解析
这道题,可以用结构体做,这是最传统的方法
但这里会介绍第二种用数组的方法,就是需要自己写排序
但整体思路都是排序Z坐标+循环套公式
题里的Pi和Pj可以直接替换成Pi和Pi+1
emmm····
这里会介绍sqrt()和pow()2个函数
就是这样
函数介绍
pow()
//头文件:
#include <cmath>
//使用方法:
pow(x,y);
/*
作用:
返回x^y,也就是x的y次方
假设x=3,y=2
那么返回值就是9
因为3*3=9
*/
sqrt()
//头文件:
#include <cmath>
//使用方法:
sqrt(x);
/*
作用:
返回根号x
假设x=16
那么返回值就是4
*/
具体代码实现
1.初始化+输入
(1) 结构体定义
struct point{
int x,y,z; //xyz坐标值
}a[50010];
(2) 变量定义
int n;
double ans; //有可能是小数
(3) 主函数+输入
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y>>a[i].z;
}
}
2.z坐标排序
(1) cmp函数
bool cmp(point e,point r){
return e.z<r.z; //升序
}
(2) 主函数内sort
sort(a+1,a+n+1,cmp);
(3) 套公式
for(int i=1;i<=n-1/*为什么是n-1呢?因为x个点只能连成x-1条线*/;i++){
ans+=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)); //核心公式
}
AC Code
#include <bits/stdc++.h>
using namespace std;
struct point{
int x,y,z; //xyz坐标值
}a[50010];
bool cmp(point e,point r){
return e.z<r.z;
}
int n;
double ans; //有可能是小数
int main(){
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/*为什么是n-1呢?因为x个点只能连成x-1条线*/;i++){
ans+=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)); //核心公式
}
cout<<fixed<<setprecision(3)<<ans<<endl; //保留三位小数
//system("pause");
return 0;
}