首页 > 代码库 > 生日相同

生日相同

题目链接:http://ica.openjudge.cn/struct/1/

总时间限制: 1000ms 内存限制: 65536kB
描述

在一个有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
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 struct stu
 5 {
 6     int month,day;//月,日
 7     char name[25]; 
 8 };
 9 struct obj
10 {
11     int month,day,count;//该日期生日的人数是count 
12 };
13 int cmp(const void *a,const void *b)//需要交换的返回1,否则返回-1或0 
14 {
15     struct stu x,y;
16     int len1,len2;
17     x=*((struct stu *)a);
18     y=*((struct stu *)b);
19     if(x.month>y.month)return 1;//需要交换 
20     else if(x.month<y.month) return 0;//不需要交换 
21     else if(x.day>y.day)return 1;
22     else if(x.day<y.day) return 0;
23     else 
24     {
25         len1=strlen(x.name);
26         len2=strlen(y.name);
27         if(len1>len2)return 1;
28         else if(len1<len2)return 0;
29         else return strcmp(x.name,y.name);//长度相等,按字典序升序排序。返回正数表示要交换,返回0或负数不交换 
30     }
31 }
32 int main(int argc, char *argv[])
33 {
34     int n,i,j,k,t;
35     struct stu a[200];
36     struct obj b[200];
37     freopen("data.in","r",stdin);
38     
39     scanf("%d",&n);
40     for(i=0;i<n;i++)
41     {
42         scanf("%s%d%d",&a[i].name,&a[i].month,&a[i].day);
43     }
44     
45     qsort(a,n,sizeof(struct stu),cmp);
46     //for(i=0;i<n;i++)
47         //printf("%d %d %s\n",a[i].month,a[i].day,a[i].name);
48     
49     b[0].month=a[0].month;
50     b[0].day=a[0].day;
51     b[0].count=1;
52     j=0;
53     for(i=1;i<n;i++)
54     {
55         if(a[i].month==b[j].month&&a[i].day==b[j].day) b[j].count++;
56         else
57         {
58             j++;
59             b[j].month=a[i].month;
60             b[j].day=a[i].day;
61             b[j].count=1;
62         }
63     }
64     
65     if(j==(n-1)) printf("None\n");
66     else
67     {
68         k=0;
69         for(i=0;i<=j;i++)
70         {
71             if(b[i].count>1)
72             {
73                 printf("%d %d",b[i].month,b[i].day);
74                 for(t=0;t<b[i].count;t++)
75                 {
76                     printf(" %s",a[k].name);
77                     k++;
78                 }
79                 printf("\n");
80             }
81             else k++;
82         }
83     }
84     return 0;
85 }

 

生日相同