生日相同
解题思路
将它们先进行排序
先日期小到大(先月后日较好)
如果相等则名字长度短到长
如果相等则名字字典序小到大
再判断有没有重复
AC代码
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,ok;
struct node
{
string name;
int month,day;
}a[100005];
bool cmp(node x,node y)//排序规则
{
if(x.month!=y.month)return x.month<y.month;
if(x.day!=y.day)return x.day<y.day;
if(x.name.size()!=y.name.size())return x.name.size()<y.name.size();
return x.name<y.name;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
cin>>a[i].name>>a[i].month>>a[i].day;
sort(a+1,a+n+1,cmp);
int i=1;
while(i<=n)//判断是否有相等的
{
if(a[i].month==a[i+1].month&&a[i].day==a[i+1].day)
{
cout<<a[i].month<<' '<<a[i].day<<' '<<a[i].name;
while(a[i].month==a[i+1].month&&a[i].day==a[i+1].day)
{
ok=1;
i++;
cout<<' '<<a[i].name;
}
printf("\n");
}
i++;
}
if(ok==0)printf("None");//输出
return 0;
}