这题考虑到所谓的年长和年轻,要通过一个按照年月日的分级排序完成(年份越小的排前面,年份相同则月份越小的排前面…一直到日)
所以使用sort函数,通过自定义排序函数为分级排序来达到目标
代码如下,包含必要的注释:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef struct
{
char name[6];
int y;
int m;
int d;
}people;
bool judge(people p)//判定一个人的生日是否合理
{
if(p.y<1814||p.y>2014) return false;
if(p.y==1814)
{
if(p.m<9) return false;
if(p.m==9&&p.d<6) return false;
}
if(p.y==2014)
{
if(p.m>9) return false;
if(p.m==9&&p.d>6) return false;
}
return true;
}
bool cmp(people p1,people p2)//排序函数(自定义排序方式,按年月日分级排序)
{
if(p1.y<p2.y) return true;
else if(p1.y==p2.y)
{
if(p1.m<p2.m) return true;
else if(p1.m==p2.m)
{
if(p1.d<p2.d) return true;
else return false;
}
else return false;
}
else return false;
}
int main()
{
int n,i;
scanf("%d",&n);
vector<people> v;
people p;
for(i=0;i<n;i++)
{
scanf("%s %d/%d/%d",p.name,&p.y,&p.m,&p.d);
if(judge(p)) v.push_back(p);
}
int count=v.size();
if(count==0) printf("0");//注意有效人数为0的情况(虽然题目中的描述似乎与此不符,但不考虑人数为0的情况则无法通过倒数第二个测试点,所以还是按照测试用例的意思来写吧)
else
{
sort(v.begin(),v.end(),cmp);
printf("%d",count);
printf(" %s",v[0].name);
printf(" %s",v[count-1].name);
}
return 0;
}