PAT-B 真题- 1028-人口普查

发布于 / PAT-乙级 / 0 条评论

原题干:

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

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过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;
}

转载原创文章请注明,转载自: 斐斐のBlog » PAT-B 真题- 1028-人口普查
目前还没有评论,快来抢沙发吧~