某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200
岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入描述:
输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及 按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出描述:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
示例1
输入
5 John 2001/05/12 Tom 1814/09/06 Ann 2121/01/30 James 1814/09/05 Steve 1967/11/20
输出
3 Tom John
#include<bits/stdc++.h>
using namespace std;
struct Person{
string name;
int y;
int m;
int d;
Person(int yy,int mm,int dd){
y=yy;
m=mm;
d=dd;
}
//数值最小代表的是年纪最大的
bool operator < (const Person &a)const{
if(y!=a.y){
return y<a.y;
}else{
if(m!=a.m){
return m<a.m;
}else{
return d<a.d;
}
}
}
};
Person minn(1814,9,5),maxn(2014,9,7),maxperson(1814,9,5),minperson(2014,9,7),tem(0,0,0);
int main(){
int n;
scanf("%d",&n);
int cnt=0;
for(int i=1;i<=n;i++){
cin>>tem.name;
scanf("%d/%d/%d",&tem.y,&tem.m,&tem.d);
if(minn<tem&&tem<maxn){
cnt++;
minperson=min(minperson,tem);
maxperson=max(maxperson,tem);
}
}
cout<<cnt;
if(cnt>0)
cout<<" "<<minperson.name<<" "<<maxperson.name<<endl;
return 0;
}