【题解】【结构体排序】——攀爬者,生日
0.前言
本篇文章是用来专门帮你了解结构体排序和排序规则的编写的。如果只想看单独一道题目的题解,可以点击目录跳转。话不多说,我们即刻出发!
1.攀爬者
题目背景
HKE 考完 GDOI 之后跟他的神犇小伙伴们一起去爬山。
题目描述
他在地形图上标记了 N N N 个点,每个点 P i P_i Pi 都有一个坐标 ( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi)。所有点对中,高度值 z z z 不会相等。HKE 准备从最低的点爬到最高的点,他的攀爬满足以下条件:
(1) 经过他标记的每一个点;
(2) 从第二个点开始,他经过的每一个点高度 z z z 都比上一个点高;
(3) HKE 会飞,他从一个点 P i P_i Pi 爬到 P j P_j Pj 的距离为两个点的欧几里得距离。即, ( X i − X j ) 2 + ( Y i − Y j ) 2 + ( Z i − Z j ) 2 \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 希望你能求出他攀爬的总距离。
输入格式
第一行,一个整数 N N N 表示地图上的点数。
接下来 N N N 行,三个整数 x i , y i , z i x_i,y_i,z_i xi,yi,zi 表示第 i i i 个点的坐标。
输出格式
一个实数,表示 HKE 需要攀爬的总距离(保留三位小数)
输入输出样例
输入 #1
5
2 2 2
1 1 1
4 4 4
3 3 3
5 5 5
输出 #1
6.928
提示
对于100%的数据, 1 ≤ N ≤ 50000 1\leq N\leq 50000 1≤N≤50000,答案的范围在 double 范围内。
1.题意解析
先将每个点按高度排序,然后逐一累加就行了。基本没有难度。
2.AC代码
#include<bits/stdc++.h>
using namespace std;
struct climb//储存每一个点信息的结构体
{
int x,y,z;
}a[50010];
double dist(climb x,climb y)//计算两点之间的欧几里得距离的函数
{
return sqrt(pow(x.x-y.x,2)+pow(x.y-y.y,2)+pow(x.z-y.z,2));
}
bool cmp(climb x,climb y)//将高度从大到小排序
{
return x.z>y.z;
}
int main()
{
int n;
double ans;
scanf("%d",&n);
for(int i=1;i<=n;i++)//输入结构体成员
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+n+1,cmp);//排序
for(int i=1;i<n;i++)
ans+=dist(a[i],a[i+1]);//记录答案
printf("%.3lf",ans);//保留三位小数
return 0;
}
2.生日
题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。
输入格式
输入共有 n + 1 n + 1 n+1 行,
第 1 1 1 行为 OI 组总人数 n n n;
第 2 2 2 行至第 n + 1 n+1 n+1 行分别是每人的姓名 s s s、出生年 y y y、月 m m m、日 d d d。
输出格式
输出共有 n n n 行,
即 n n n 个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
输入输出样例
输入 #1
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
输出 #1
Luowen
Yangchu
Qiujingya
提示
数据保证, 1 < n < 100 1<n<100 1<n<100, 1 ≤ ∣ s ∣ < 20 1\leq |s|<20 1≤∣s∣<20。保证年月日实际存在,且年份 ∈ [ 1960 , 2020 ] \in [1960,2020] ∈[1960,2020]。
1.题意解析
一道经典的结构体排序,也是直接模拟就行了,就是cmp
函数有点复杂,具体对应关系请看图:
2.AC代码
#include<bits/stdc++.h>
using namespace std;
struct student//定义学生结构体
{
string name;
int year,month,day,num;//num代表输入顺序
}a[110];
bool cmp(student x,student y)
{
if(x.year==y.year)
if(x.month==y.month)
if(x.day==y.day)//同年同月同日生
return x.num>y.num;//输入靠后的同学先输出
else
return x.day<y.day;//同年同月生
else
return x.month<y.month;//同年生
return x.year<y.year;//否则年份大的先输出
}
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i].name>>a[i].year>>a[i].month>>a[i].day,a[i].num=i;
sort(a+1,a+n+1,cmp);//排序
for(i=1;i<=n;i++)//输出姓名
cout<<a[i].name<<endl;
return 0;
}
喜欢就订阅此专辑吧!
【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。
欢迎扫码关注蓝胖子编程教育