【PAT乙级】人口普查

正文索引 [隐藏]

题目描述:

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的-假设已知镇上没有超过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

解题思路:

首先,根据题意可知这个人口普查其实就是2个变量而已嘛,一个name,一个birthday,那就直接建立一个person结构体好了。然后根据题目要求这个岛上的人生日在1814/09/06至2014/09/06这个范围内,接下来直接用for循环对输入进行遍历来求解在这个范围内的有效生日并找出最年长和最年轻的人所在的下标就好了。然而!我第一次提交的时候有个测试用例WA了,找了N久之后终于发现当有效个数为0时,后面不能够输出多余的空格。

 AC代码:

#include <bits/stdc++.h>
using namespace std;
struct person
{
    string name,birthday;
};
int main()
{
    int n;
    cin >> n;
    string start = "1814/09/06";
    string end = "2014/09/06";
    person p[n];
    int count=0;
    bool flag = true;
    int minIndex,maxIndex;
    for (int i = 0; i < n; i++)
    {
        cin >> p[i].name >> p[i].birthday;
        if(p[i].birthday>=start && p[i].birthday<=end)
        {
            count++;
            if(flag)
            {
                flag = false;
                minIndex = i, maxIndex = i;
            }
            else
            {
                if(p[minIndex].birthday>p[i].birthday)
                {
                    minIndex = i;
                }
                if(p[maxIndex].birthday<p[i].birthday)
                {
                    maxIndex = i;
                }
            }
        }
    }
    if(count != 0)
    {
        cout << count << " " << p[minIndex].name << " " << p[maxIndex].name << endl;
    }
    else  //有效个数为0时,输出0且后面不能有空格
    {
        cout << count << endl;
    }
    return 0;
}