【PAT乙级】1028 人口普查 (20分)

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数 N N N,取值在(0,10^​5];随后 N N 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

解题思路:

  1. 结构体 p e r s o n person person 包含名字 n a m e name name、出生日期 b i r t h birth birth,声明结构体数组 p e r per per
  2. 结构体变量 e l d e s t eldest eldest 初始化 2014 / 09 / 06 2014/09/06 2014/09/06 y o u n g e s t youngest youngest 初始化为 1814 / 09 / 06 1814/09/06 1814/09/06,遍历结构体数组 p e r per per,更新 e l d e s t eldest eldest y o u n g e s t youngest youngest

N o t e Note Note: 当输入样例数为 0 0 0 时,输出末尾不带空格的 0 0 0

答案样例:

#include 
#include 
using namespace std;

const int maxn = 100005;
struct person {
    string name;
    string birth;
} per[maxn];


int main()
{
    int n = 0, cnt = 0;
    cin >> n;
    person youngest, eldest;
    youngest.birth = "1814/09/06";
    eldest.birth = "2014/09/06";
    
    for(int i = 0; i < n; i++)
    {
        cin >> per[i].name >> per[i].birth;
        if(per[i].birth >= "1814/09/06" && per[i].birth <= "2014/09/06")
        {
            if (per[i].birth > youngest.birth) youngest = per[i];
            if (per[i].birth < eldest.birth) eldest = per[i];
            cnt++;
        }
    }

    if(cnt)
        cout << cnt << " " << eldest.name << " " << youngest.name << endl;
    else
        cout << "0" << endl;

    return 0;
}

你可能感兴趣的:(PAT)