1028 人口普查 (20 分)
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按
yyyy/mm/dd
(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
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 <iostream>
using namespace std;
struct node{
string name;
int yy, mm, dd;
};
bool isLogical(node a){ //是否合理
if(a.yy < 1814 || (a.yy == 1814 && a.mm < 9) || (a.yy == 1814 && a.mm == 9 && a.dd < 6))
return false;
else if(a.yy > 2014 || (a.yy == 2014 && a.mm > 9) || (a.yy == 2014 && a.mm == 9 && a.dd > 6))
return false;
return true;
}
int main(){
int n, cnt = 0;
cin >> n;
node temp, naive, frog; //年轻人与长者
naive.yy = naive.mm = naive.dd = 0; //初始化
frog.yy = frog.mm = frog.dd = 9999; //初始化
for(int i = 0; i < n; i++){
cin >> temp.name;
scanf("%d/%d/%d", &temp.yy, &temp.mm, &temp.dd);
if(isLogical(temp)){ //只需处理合理输入
cnt++;
if(temp.yy > naive.yy || (temp.yy == naive.yy && temp.mm > naive.mm) || (temp.yy == naive.yy && temp.mm == naive.mm && temp.dd > naive.dd))
naive = temp;
if(temp.yy < frog.yy || (temp.yy == frog.yy && temp.mm < frog.mm) || (temp.yy == frog.yy && temp.mm == frog.mm && temp.dd < frog.dd))
frog = temp;
}
}
if(cnt) cout << cnt << " " << frog.name << " " << naive.name;
else cout << cnt;
return 0;
}