题解P1104生日

\(\color{blue}{P1104 生日(题目传送门)}\)


这道题的大意是:给出n个人的出生日期,让我们按年龄(就是先比年份,再比月份和日期,这是常识好吧)大小来排序,如果相同则按输入顺序排序。


开始解题

  • 理清题意后,我们只需按题意去模拟即可。

1. 强大的STL

大家肯定不陌生,STL里面有个sort的函数,格式为

sort(a.begin(),a.end());

然而,sort函数实际上是有3个参数的,除了其实位置和结束位置意外,还有一个用户自定义的cmp函数,当然,这个cmp函数还是需要自己写的,因为sort默认从小到大排,而对于结构体或者从小到大排,则需要用到cmp函数了。具体用法如下:

sort(a+1,a+1+n,cmp);//sort排序
//cmp函数
bool cmp(int x,int y)//从大到小排 
{
	return x>y;
}

具体代码如下:

mgL5Kf.png

运行结果如下:

mgLoqS.png

显然,这样就实现了自定义排序的功能。

2.结构体

这道题,最方便的存储名字即年月日的方法就是用结构体来存,用法见下:

struct node{//struct+结构体名字
//定义这个结构体里的变量
	string name;
	int year;
	int month;
	int day;
	int num;
}a[105];//注意这里的;当然c++里面struct 是自动生成‘;’的,无需再打

这就相当于对一个人的身份信息进行绑定了。

3.代码实现

代码实现就简单了,用结构体存储信息,再sort排序一下就OK了

code:

#include <bits/stdc++.h>
using namespace std;
int n;
struct node{//结构体 
	string name;//记录名字 
	int year;//出生年份 
	int month;//出生月份 
	int day;//出生日期 
	int num;//输入顺序 
}a[105];
bool cmp(node x,node y){//cmp排序 注意此处的用法bool cmp(node x,node y)必须用结构体的名字,而不能用a x,a y。 
	if(x.year!=y.year)return x.year<y.year;//如果年份不同,则按年份小的在前面。 
	if(x.month!=y.month)return x.month<y.month;//...
	if(x.day!=y.day)return x.day<y.day;
	return x.num>y.num;
}
int main(){
	cin>>n;
	for(int 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+1+n,cmp);//sort排序 
	for(int i=1;i<=n;i++)cout<<a[i].name<<endl;//打印排序后的名字。 
	return 0;
}

运行样例结果:
mgX2ct.png

没有问题~~~

posted @ 2020-02-04 20:49  zzx0826  阅读(261)  评论(0编辑  收藏  举报