1028. 人口普查(20)

时间:2022-07-12 07:13:54

查看原题目请点我这里

解题思路
首先把合理的人员加入结构体中,在加入的时候顺便统计一下有多少个人,然后对结构体中合格的人员按照出生日期进行排序,得到最年长的在第一位,最年轻的在最后一位,直接输出就行了。是否是合理的人员通过check函数判断。
注意
当没有合格的人员时,直接输出0就行了。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1000005;
struct per{
char name[8];
int year,mon,day;
}E[maxn];
bool cmp(per a,per b){
if(a.year != b.year)
return a.year < b.year;
else if(a.mon != b.mon)
return a.mon < b.mon;
else
return a.day < b.day;
}
int check(int yy,int mm,int dd){
if(yy<1814||yy>2014)
return 0;
else if(yy==1814){
if(mm < 9) return 0;
else if(mm>9) return 1;
else{
if(dd>=6) return 1;
else return 0;
}
}else if(yy==2014){
if(mm > 9) return 0;
else if(mm < 9) return 1;
else{
if(dd <= 6) return 1;
else return 0;
}
}else return 1;
}
int main(){
int N;
scanf("%d",&N);
char s[8];
int y,m,d,k=0;
for(int i=0;i<N;i++){
scanf("%s %d/%d/%d",s,&y,&m,&d);
int tag=check(y,m,d);
if(tag==1){
strcpy(E[k].name,s);
E[k].year=y;
E[k].mon=m;
E[k].day=d;
k++;
}
}
sort(E,E+k,cmp);
if(k==0) printf("0\n");
else printf("%d %s %s\n",k,E[0].name,E[k-1].name);
return 0;
}