目录
题目概述:
028 人口普查 (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>
#include<string>
#include<algorithm>
using namespace std;
struct person
{
string name;
int year=0, month=0, day=0;//出生年月日
};
bool read(person& a)
{
cin >> a.name;
scanf("%d/%d/%d", &a.year,&a.month,&a.day);
if (a.year < 1814 || a.year>2014)
return false;
if (a.year < 2014 && a.year>1814)
return true;
int tag = 0;//标记是2014年的还是1814年的
if (a.year == 2014)
tag = 0;
else
tag = 1;
if (a.year == 2014 || a.year ==1814)
{
if (a.month > 9)
{
if (tag)
return true;
else
return false;
}
if (a.month < 9)
{
if (tag)
return false;
else
return true;
}
if (a.month == 9)
{
if (a.day < 6)
{
if (tag)
return false;
else
return true;
}
if (a.day > 6)
{
if (tag)
return true;
else
return false;
}
if (a.day == 6)
return true;
}
}
}
person mymin(person a, person b)
{
if (a.year != b.year)
{
return a.year > b.year ? a : b;
}
if (a.month != b.month)
{
return a.month > b.month ? a : b;
}
if (a.day != b.day)
{
return a.day > b.day ? a : b;
}
}
person mymax(person a, person b)
{
if (a.year != b.year)
{
return a.year < b.year ? a : b;
}
if (a.month != b.month)
{
return a.month < b.month ? a : b;
}
if (a.day != b.day)
{
return a.day < b.day ? a : b;
}
}
int main()
{
int n;
cin >> n;
person per, old, youth;
youth.year = 9999;
int right = 0;
int flag = 0;
for (int i = 0; i < n; ++i)
{
if (read(per))//检查合理才判断
{
++right;
if (!flag)
{
old = per;
youth = per;
flag = 1;
}
else
{
old = mymax(per, old);
youth = mymin(per, youth);
}
}
}
if (!right)
{
cout << right << endl;
return 0;
}
cout << right <<" "<<old.name <<" "<< youth.name << endl;
return 0;
}
分析思路:
1.自定义函数判断生日是否合理。
2.因为这题只问最年长和最年幼,所以不采用sort自定义排序方式的方法(没试过,估计会超时吧),使用在线处理打擂台法确定最年长和最年幼即可。
3.注意一个小坑点,如果有效生日0个,那么不能有后面的空格,否则格式错误。