PAT B1028 人口普查(C++)

PAT甲级目录 | PAT乙级目录

题目描述

B1028 人口普查

解题思路

在一边输入数据一边过滤记录,并更新当前最年长的及最年轻的记录。使用排序函数将会超时。

易错点

  • 使用排序函数将会超时
  • 当有效记录数为零时不输出名字

也许陌生的知识点

  • bool cmp(person a, person b){ }
    • 借鉴了 sort 中的 cmp 函数,可用于判断两个结构体大小

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <cstdio>
#include <cstring>
struct person{
char name[10];
int y, m, d;
}old, young, temp;
bool isvalid(person a){//判断年龄是否合理
if(a.y < 1814 || a.y > 2014) return false;
else if((a.y == 1814 && a.m < 9) || (a.y == 2014 && a.m > 9))return false;
else if((a.y == 1814 && a.m == 9 && a.d < 6) || (a.y == 2014 && a.m == 9 && a.d > 6)) return false;
else return true;
}
bool cmp(person a, person b){//比较两个记录长幼
if(a.y != b.y) return a.y < b.y;
else if(a.m != b.m) return a.m < b.m;
else return a.d < b.d;
}
int main(){
int N, cnt = 0;
scanf("%d", &N);
for(int i = 0; i < N; i++){
scanf("%s %d/%d/%d", &temp.name, &temp.y, &temp.m, &temp.d);
if(isvalid(temp) == true){// 过滤不合理的记录
if(cnt == 0) old = young = temp;
if(cmp(old, temp) == false) old = temp;// 比较大小
if(cmp(young, temp) == true) young = temp;
cnt++;
}
}
if(cnt == 0) printf("0\n");// 正确输出
else printf("%d %s %s\n", cnt, old.name, young.name);
return 0;
}