原题干:
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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
这道题要特别注意有效与无效时间分界线上的生日。另外,有一个测试点是生日全都无效的,这个测试点要注意只能输出一行0,否则第四个测试点会报格式错误。(就是这个辣鸡错误导致我研究了一上午。。。)
代码:
#include <cstdio>
#include <vector>
using namespace std;
typedef struct {
char name[70];
int yyyy;
int mm;
int dd;
} people_node;
int main() {
int y, m, d, cnt;
people_node p_node, youngest = {"",99999,999,999}, oldest = {"",0,0,0};
vector<people_node> people;
scanf("%d", &cnt);
while(cnt--) {
scanf("%s %4d/%2d/%2d",&p_node.name, &p_node.yyyy, &p_node.mm, &p_node.dd);
if((p_node.yyyy < 2014 || (p_node.yyyy == 2014 && p_node.mm < 9) || (p_node.yyyy == 2014 && p_node.mm == 9 && p_node.dd <= 6)) &&
(p_node.yyyy > 1814 || (p_node.yyyy == 1814 && p_node.mm > 9) || (p_node.yyyy == 1814 && p_node.mm == 9 && p_node.dd >= 6)))
{
people.push_back(p_node);
if((p_node.yyyy < youngest.yyyy) || ((p_node.yyyy == youngest.yyyy) && (p_node.mm < youngest.mm)) || ((p_node.yyyy == youngest.yyyy) && (p_node.mm == youngest.mm) && (p_node.dd < youngest.dd)))
youngest = p_node;
if((p_node.yyyy > oldest.yyyy) || ((p_node.yyyy == oldest.yyyy) && (p_node.mm > oldest.mm)) || ((p_node.yyyy == oldest.yyyy) && (p_node.mm == oldest.mm) && (p_node.dd > oldest.dd)))
oldest = p_node;
}
}
if(people.size()) //有有效的生日
printf("%d %s %s",people.size(), youngest.name, oldest.name);
else //全无效
printf("0");
return 0;
}