XOJ 2569:生日相同

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


Input Data

第一行为整数n,表示有n个学生,n<=180。
此后每行包含一个字符串和两个整数,分别表示学生的姓名(字符串长度小于10且唯一)和出生月(1<=m<=12)日(1<=d<=31)。
学号、月、日之间用一个空格分隔。

Output Data

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

若没有相同的,输出None


Input / Output Sample
7
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 6
Lagrange 4 5
Bill 3 2
Aim 3 2
3 2 Aim Tim Bill Avril 
4 5 Candy Lagrange

代码实现:
#include
#include
#include
using namespace std;
struct student                //每个学生信息的结构体
{
    char name[20] = {0};
    int d = 0, m = 0, num = 0;
};
bool cmp(student a, student b)		//排序的依据函数,输入的是结构体
{
    if(strlen(a.name)<strlen(b.name))
        return 1;
    else if(strlen(a.name) == strlen(b.name) && strcmp(a.name,b.name) < 0)
        return 1;
    return 0;
}
int main()
{
    struct student a[180];
    int n, flag = 0;
    scanf("%d",&n);
    getchar();
    for(int i = 0; i < n; i++)
    {
        scanf("%s",a[i].name);
        scanf("%d%d",&a[i].m,&a[i].d);
        getchar();
    }
    sort(a,a+n,cmp);	//使用sort算法函数进行排序,范围是[a,a+n),左闭右开
    for(int i = 0; i < n-1; i++)
    {
        for(int j = i+1; j < n; j++)
        {
            if(a[i].d == a[j].d && a[i].m == a[j].m && a[i].num == 0)
            {
                printf("%d %d %s ",a[i].m,a[i].d,a[i].name);
                a[i].num = 1;
                flag = 1;
            }
            if(a[i].d == a[j].d && a[i].m == a[j].m && a[j].num == 0)
            {
                printf("%s ",a[j].name);
                a[j].num = 1;
                flag = 1;
            }
        }
        if(flag == 1)
        {
            printf("\n");
            flag = 0;
        }
    }
    flag = 0;
    for(int i = 0; i < n; i++)   //判断有无输出
    {
        if(a[i].num == 1)   flag = 1;
    }
    if(flag == 0)   printf("None");
    return 0;
}

链接:www.xoj.red

你可能感兴趣的:(XOJ 2569:生日相同)