【题解】【结构体排序】——攀爬者,生日

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} (XiXj)2+(YiYj)2+(ZiZj)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 1N50000,答案的范围在 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 1s<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;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝胖子教编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值