生日(c++)年龄从大到小排序

内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较

题目描述
小明想要调查学校每个同学的生日,并按照年龄从大到小的顺序排列,但是小明最近的课程很多,没有时间,所以请你帮他排序。

输入格式
第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)
{
    if(x.b<y.b)
        return 1;
    if(x.b==y.b&&x.c<y.c)
        return 1;
    else if(x.b==y.b&&x.c==y.c&&x.d<y.d)
        return 1;
    else if(x.b==y.b&&x.c==y.c&&x.d==y.d&&strlen(x.a)<strlen(y.a))
        return 1;
    else if(x.b==y.b&&x.c==y.c&&x.d==y.d&&strlen(x.a)==strlen(y.a))
        for(int k=0;k<=strlen(x.a);k++)
            if(x.a[k]<y.a[k])
                return 1;
            else if(x.a[k]==y.a[k])
                continue;
            else
                return 0;
    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);
}

注意,在字典序排序的时候

for(int k=0;k<=strlen(x.a);k++)
            if(x.a[k]<y.a[k])
                return 1;
            else if(x.a[k]==y.a[k])
                continue;
            else
                return 0;

因为当当前字符串x的k号元素等于了字符串y的k号元素。