洛谷 P5143 攀爬者 题解

原题链接

P5143 攀爬者

内心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;
}
posted @ 2022-12-12 17:25  第二关键句  阅读(405)  评论(0)    收藏  举报