题目描述】
在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。
【输入】
第一行为整数n,表示有n个学生,n ≤ 180。此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于20)和出生月(1 ≤ m ≤ 12)日(1 ≤ d ≤ 31)。名字、月、日之间用一个空格分隔
【输出】
每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。对所有的输出,要求按日期从前到后的顺序输出。 对生日相同的名字,按名字从短到长按序输出,长度相同的按字典序输出。如没有生日相同的学生,输出”None”。
For example:
Input
6
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 5
Lagrange 4 5
Bill 3 2
Result
3 2 Tim Bill Avril
4 5 Candy Sufia Lagrange
Input
3
Ecpio 11 24
Duwvgiyc 12 21
Xmag 4 1
Result
None
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct student
{
int y,m;
char name[30];
}s[200];
bool cmp(student a,student b)
{
if(a.y==b.y)
{
if(a.m==b.m)
{
if(strlen(a.name)==strlen(b.name))
{
return strcmp(a.name,b.name)<0;
}else
{
return strlen(a.name)<strlen(b.name);
}
}else
{
return a.m<b.m;
}
}else
{
return a.y<b.y;
}
}
int n,f,cnt;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s[i].name>>s[i].y>>s[i].m;
}
sort(s,s+n,cmp);
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(s[j].y==s[j-1].y&&s[j].m==s[j-1].m)
{
if(f==0)
{
cout<<s[j].y<<' '<<s[j].m<<' '<<s[j-1].name;
f=1;
cnt++;
i=j+1;
}
cout<<' '<<s[j].name;
}else
{
if(f==1) cout<<endl;
f=0;
break;
}
}
}
if(cnt==0) cout<<"None"<<endl;
return 0;
}