描述:
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。

输入
第一行为整数n,表示有n个学生,n≤180。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1≤m≤12)日(1≤d≤31)。名字、月、日之间用一个空格分隔。

输出
每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对所有的输出,要求按日期从前到后的顺序输出。对生日相同的名字,按名字从短到长顺序输出,长度相同的按字典顺序输出。如没有生日相同的学生,输出“None”。

样例输入
6
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 5
Lagrange 4 5
Bill 3 2

样例输出
3 2 Tim Bill Avril
4 5 Candy Sufia Lagrange

分析:
对于这样的问题,首先想到的就是排序,的确也就是用排序做的,但是这个问题的排序是分为好几层来判断排序的,比较复杂的一个排序改写,最后输出时也要做一定的处理方能以我们需要的格式输出。

代码如下(C):

#include <stdio.h>
#include <string.h>
#define _MAX 181

int n;
char name[_MAX][21];
int len[_MAX];
int month[_MAX];
int day[_MAX];

//交换
void swap(int i, int j)
{
    int k, length;
    len[i] ^= len[j];
    len[j] ^= len[i];
    len[i] ^= len[j];
    month[i] ^= month[j];
    month[j] ^= month[i];
    month[i] ^= month[j];
    day[i] ^= day[j];
    day[j] ^= day[i];
    day[i] ^= day[j];
    length = len[i] > len[j] ? len[i] : len[j];
    for (k = 0; k < length; k++)
    {
        name[i][k] ^= name[j][k];
        name[j][k] ^= name[i][k];
        name[i][k] ^= name[j][k];
    }
    return ;
}

//判断字典顺序
int dic(int i, int j)
{
    int k;
    for (k = 0; k < len[i]; k++)
    {
        if (name[i][k] > name[j][k])
        {
            return 1;
        }
        else if (name[i][k] < name[j][k])
        {
            return 0;
        }
    }
    return 0;
}

//排序
void sequence()
{
    int i = 0, j = 0;
    for (; i < n - 1; i++)
    {
        for (j = i + 1; j < n; j++)
        {
            if (month[i] > month[j])
            {
                swap(i, j);
            }
            else if (month[i] == month[j])
            {
                if (day[i] > day[j])
                {
                    swap(i, j);
                }
                else if (day[i] == day[j])
                {
                    if (len[i] > len[j])
                    {
                        swap(i, j);
                    }
                    else if (len[i] == len[j])
                    {
                        if (dic(i, j))
                        {
                            swap(i, j);
                        }
                    }
                }
            }
        }
    }
    return ;
}

//输出
void print()
{
    int i, j, count, key = 0;
    for (i = 0; i < n;)
    {
        count = 0;
        for (j = i + 1; j < n; j++)
        {
            if (month[i] == month[j] && day[i] == day[j])
            {
                count++;
            }
            else
            {
                break;
            }
        }
        if (count)
        {
            key++;
            printf("%d %d ", month[i], day[i]);
            for (; i < j - 1; i++)
            {
                printf("%s ", name[i]);
            }
            printf("%s\n", name[i++]);
        }
        if (!key)
        {
            printf("None\n");
        }
    }
    return ;
}

int main(int argc, const char * argv[])
{
    int i = 0;
    scanf("%d", &n);
    for (; i < n; i++)
    {
        scanf("%s %d %d", name[i], &month[i], &day[i]);
        len[i] = (int)strlen(name[i]);
    }
    sequence();

    print();
    return 0;
}

OVER!!!