人口普查
题目描述
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式
输入在第一行给出正整数 N,取值在(0,$10^5$];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd
(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例
1 | 5 |
输出样例
1 | 3 Tom John |
问题解决
解题思想
分别设置最年长人和最年轻人的姓名、生日,最年长人的生日初始化为最晚的年月日,最年轻人的生日初始化为最早的年月日(想一下为什么要这样初始化?);用scanf()函数读入每一个人的姓名及生日(注意:不能用gets()函数,思考一下为什么?它们遇到空格的处理?),此处,生日以字符串的形式读入,构造一个函数将字符串格式生日转换成数值形式,通过引用来返回数值型的year,month,day;接着,判断此时输入的生日是否合理(不是年龄超过200岁的情况或未出生的生日的情况),若不合理,用continue直接跳过本次循环,进入下一次输入,若合理,判断是否比目前最年长的人更年长或者比目前最年轻的人更年轻,并进行相应的更新。
坑点提醒
本题容易忽略的一个点就是:对有效生日个数为0个的特殊情况的处理。若有效生日个数为0个则不存在最年长或最年轻的人,相应的,只需输出有效生日个数即可(0),不需要输出最年长或最年轻的人的姓名。这也是PAT在线评测系统倒数第二个测试点测试的内容,若此处处理不当则此测试点将不会通过。
代码示例(C/C++)
1 |
|
题目来源:PAT乙级1028
作者:CHEN, Yue
单位:浙江大学