今天做了一道排序的题,用了sort排序,而对附属语句cmp函数的使用不熟悉
下面是一道题
生日(快乐暑假)
总时间限制:
1000ms
内存限制:
65536kB
描述
小明想要调查学校每个同学的生日,并按照年龄从大到小的顺序排列,但是小明最近的作业很多,没有时间,所以请你帮他排序。
输入
第1行:学校学生的总人数n
第2行至第n+1行:每一行分别是每位学生的姓名s,出生年y,月m,日d,中间用空格隔开。(姓名s中不包含空格)
输出
有n行:即n个按照年龄从大到小的顺序排列的学生姓名。(如果有两个学生的生日相同,先输出s较短的同学;若s的长度相同,则按照姓名的字典序从小到大输出;)
样例输入
3
Yangchu 2006 04 03
Qiujingya 2007 10 13
Luowen 2005 08 01
样例输出
Luowen
Yangchu
Qiujingya
提示
【数据规模】
2<=n<=10000;Length(s)<=20;
以及个人代码
先前是用冒泡排序
然而超时了
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
char a[25];
int b;
int c;
int d;
}m[10005];
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%s %d%d%d",m[i].a,&m[i].b,&m[i].c,&m[i].d);
for(i=1;i<=n;i++)
{
for(j=1;j<=n-1;j++)
{
if(m[j].b>m[j+1].b)
swap(m[j],m[j+1]);
else if(m[j].b==m[j+1].b&&m[j].c>m[j+1].c)
swap(m[j],m[j+1]);
else if(m[j].b==m[j+1].b&&m[j].c==m[j+1].c&&m[j].d>m[j+1].d)
swap(m[j],m[j+1]);
else if(m[j].b==m[j+1].b&&m[j].c==m[j+1].c&&m[j].d==m[j+1].d)
for(k=0;k<=strlen(m[j].a);k++)
if(m[j].a[k]>m[j+1].a[k])
{
swap(m[j],m[j+1]);
break;
}
else if(m[j].a[k]<m[j+1].a[k])
break;
}
}
for(i=1;i<n;i++)
puts(m[i].a);
printf("%s",m[n].a);
}
所以改用了sort+cmp函数
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
char a[25];
int b;
int c;
int d;
}m[10005];
bool cmp(node x,node y)
{
return x.b<y.b;
if(x.b==y.b)
return x.c<y.c;
else if(x.b==y.b&&x.c==y.c)
return x.d<y.d;
else if(x.b==y.b&&x.c==y.c&&x.d==y.d)
for(int k=0;k<=strlen(x.a);k++)
return x.a[k]<y.a[k];
else
return 0;
}
int main()
{
int n,i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%s %d%d%d",m[i].a,&m[i].b,&m[i].c,&m[i].d);
sort(m+1,m+n+1,cmp);
for(i=1;i<n;i++)
puts(m[i].a);
printf("%s",m[n].a);
}