PAT B1028 人口普查

时间:2019-08-23
本文章向大家介绍PAT B1028 人口普查,主要包括PAT B1028 人口普查使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

PAT B1028 人口普查

题目描述:

  某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

  输入格式:
  输入在第一行给出正整数 N,取值在(0,10​5​​];随后 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 /****************************************************
 2 PAT B1028 人口普查
 3 ****************************************************/
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <vector>
 7 
 8 using namespace std;
 9 
10 const int TODAY = 20140906;   //对应2014.09.06
11 const int NORMAL = 18140906;  //对应1814.09.06
12 
13 struct BornInfo {
14     string name = "";
15     int year = 0, month = 0, day = 0;
16     int time = 0;   //自定义出生时间标志:time = year * 10000 + month * 100 + day。方便日期合理与否和年龄大小的判断
17 };
18 
19 int main() {
20     int count = 0;
21     vector<BornInfo> legalInfo;
22 
23     cin >> count;
24 
25     char c;                                   //读取日期中的分隔符
26     BornInfo temp;                            //临时存储人员信息
27     int edgeTime[2] = { TODAY, NORMAL };      //{年龄最大的人的出生时间标志,年龄最小的人的出生时间标志}
28     int edgePerLoc[2] = { 0 };                //{年龄最大的人对应的存储位置,年龄最小的人对应的存储位置}
29     for (int i = 0; i < count; ++i) {
30         cin >> temp.name >> temp.year >> c >> temp.month >> c >> temp.day;
31 
32         temp.time = temp.year * 10000 + temp.month * 100 + temp.day;  //计算出生时间标志
33 
34         if (temp.time <= TODAY && temp.time >= NORMAL) {              //判断出生日期是否合理
35             legalInfo.push_back(temp);
36 
37             if (temp.time > edgeTime[1]) {                            //比较、更新年龄最大、最小者的信息
38                 edgePerLoc[1] = legalInfo.size() - 1;
39                 edgeTime[1] = temp.time;
40             }
41             else if (temp.time < edgeTime[0]) {
42                 edgePerLoc[0] = legalInfo.size() - 1;
43                 edgeTime[0] = temp.time;
44             }
45         }
46     }
47 
48     if (legalInfo.size() == 0) {
49         cout << '0';
50     }
51     else {
52         cout << legalInfo.size() << ' ' << legalInfo[edgePerLoc[0]].name << ' ' << legalInfo[edgePerLoc[1]].name;
53     }
54 
55     return 0;
56 }

注意事项:

   1:比较日期时,如果分别比较年、月、日会有多种情况,直接将年、月、日拼接成一个新的数字(108以内,在int类型表示范围内)并进行比较可以“一步到位”的得到两个日期的比较结果,上述代码使用的就是这种比较日期的方法。

原文地址:https://www.cnblogs.com/mrdragon/p/11397732.html