PAT Basic 1028

1028 人口普查

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

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

  题解:这道题目没有什么难度,只需要找出符合条件的,最年长的人和最年轻的
人即可。第一次做的时候傻乎乎的写了一个结构体排序,将所有符合条件的人全部记
录下来,在用sort排序。其实在输入的时候直接记录下最大值和最小值还有合格数就好了。
代码如下:
 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 struct people
 8 {
 9     string name;
10     string brithday;
11     int year;
12     int month;
13     int day;
14 };
15 
16 people a[100000];
17  
18 bool cmd( const people &a,const people &b)
19 {
20     if( a.year < b.year)
21         return a.year < b.year;
22     else if( a.year == b.year && a.month < b.month)
23         return  a.month < b.month;
24     else if( a.year == b.year && a.month == b.month && a.day < b.day)
25         return  a.day < b.day;
26     else
27         return false;
28 }
29 
30 int main()
31 {
32     int n, m = 0, year, month, day, k = 1000;
33     string name, brithday;
34     cin>>n;
35     for( int i = 0; i < n; i++){
36         cin>>name;
37         cin>>brithday;
38         year = 0;
39         month = 0;
40         day = 0;
41         k = 1000;
42         for( int i = 0; i < 4; i++){
43             year += (brithday[i] - '0')*k;
44             k /= 10;
45         }
46         if( year > 2014) continue;
47         if( 2014 - year > 200)
48             continue;
49         k = 10;
50         for( int i = 5; i < 7; i++){
51             month += (brithday[i] - '0')*k;
52             k /= 10;
53         }
54         if( year == 2014 && month > 9) continue;
55         if( 2014 - year == 200 && month < 9)
56             continue;
57         k = 10;
58         for( int i = 8; i < 10; i++){
59             day += ( brithday[i] - '0')*k;
60             k /= 10;
61         }
62         if( year == 2014 && month == 9 && day > 6) 
63             continue;
64         if( (2014 - year) == 200 && month == 9 && day < 6)
65             continue;
66         a[m].brithday = brithday;
67         a[m].name = name;
68         a[m].year = year;
69         a[m].month = month;
70         a[m].day = day;
71         m++;
72     }
73     sort( a, a+m, cmd);
74     if( m == 0) 
75         cout<<"0";
76     else
77         cout<<m<<" "<<a[0].name<<" "<<a[m-1].name;
78     return 0;
79 }
 

猜你喜欢

转载自www.cnblogs.com/yxp400/p/9456237.html