PTA 乙级 1028 人口普查 (20分) C/C++(全部测试点分析)

 总共写了两版,第一版的代码复制较多,所以改了第二版

测试点0:一开始这个测试点错了很多遍,后来做了个标志位存储第一个数据,就通过了。。。

测试点1、2:若有超出年龄范围的,则无法通过此测试点

测试点3:有效次数为0时,必须仅输出0,后面不可有其他的数据

测试点4:挺容易超时,建议不要用java做本题

C/C++

第一版

 1 #include<iostream>
 2 #include<string>
 3 
 4 using namespace std;
 5 
 6 struct {
 7     int y;
 8     int m;
 9     int d;
10     string name;
11 }ol, yo, man;
12 
13 int main() {
14     /*总人数*/
15     int n = 0;
16     /*有效次数*/
17     int    ef = 0;
18     int flag = 1;
19     cin >> n;
20     for (int i = 0; i < n; i++) {
21         cin >> man.name;    
22         scanf("%d/%d/%d", &man.y, &man.m, &man.d);    //为通过vs的编译则用scanf_s,实际PTA的OJ系统不用
23         //是否超出年龄限制
24         if (man.y > 2014) continue;
25         else if (man.y == 2014 && man.m > 9) continue;
26         else if (man.y == 2014 && man.m == 9 && man.d > 6) continue;
27         if (man.y < 1814) continue;
28         else if (man.y == 1814 && man.m < 9) continue;
29         else if (man.y == 1814 && man.m == 9 && man.d < 6) continue;
30         //有效人数增加
31         ef++;
32 
33         if (flag) {
34             ol = man;
35             yo = man;
36             flag = 0;
37         }
38         //年龄较大
39         if (man.y < ol.y) ol = man;
40         else if (man.y == ol.y && man.m < ol.m) ol = man;
41         else if (man.y == ol.y && man.m == ol.m && man.d < ol.d) ol = man;
42         //年龄较小
43         if (man.y > yo.y) yo = man;
44         else if (man.y == yo.y && man.m > yo.m) yo = man;
45         else if (man.y == yo.y && man.m == yo.m && man.d > yo.d) yo = man;
46     }
47     if (ef == 0)cout << ef;    //有效人数为0,则直接输出0(不可多输出空格,否则测试点3无法通过)
48     else cout << ef << " " << ol.name << " " << yo.name; 
49     return 0;
50 }

第二版

 1 #include<iostream>
 2 #include<string>
 3 
 4 using namespace std;
 5 
 6 typedef struct {    //以人为单位的结构体
 7     int y;
 8     int m;
 9     int d;
10     string name;
11 }human;
12 
13 int cmp(human *a,human *b) {            //比较函数(a大返回1,b大返回0)
14     int aflag = 0;
15     if (a->y > b->y) aflag = 1;
16     else if (a->y == b->y && a->m > b->m) aflag = 1;
17     else if (a->y == b->y && a->m == b->m && a->d > b->d) aflag = 1;
18     return aflag;
19 }
20 
21 int main() {
22     /*总人数*/
23     int n = 0;
24     /*有效人数*/
25     int    ef = 0;
26     int flag = 1;
27     /*所有人结构体*/
28     human ol, yo, man, oldm, yonm;
29     oldm = { 1814,9,6,"max" };            //年龄最大
30     yonm = { 2014,9,6,"min" };            //年龄最小
31     cin >> n;
32     for (int i = 0; i < n; i++) {
33         //输入
34         cin >> man.name;
35         scanf("%d/%d/%d", &man.y, &man.m, &man.d);    //为通过vs的编译则用scanf_s,实际PTA的OJ系统不用
36         //判断是否超过年龄限制
37         if (cmp(&man, &yonm))continue;
38         if (cmp(&oldm, &man))continue;
39         //未超过年龄限制,有效人数增加
40         ef++;
41         if (flag) {
42             ol = man;
43             yo = man;
44             flag = 0;
45         }
46         if (cmp(&yo, &man))yo = man;    //统计年龄最大
47         if (cmp(&man, &ol))ol = man;    //统计年龄最小
48     }
49     if (ef == 0)cout << ef;                //有效人数为0,则直接输出0(不可多输出空格,否则测试点3无法通过)
50     else cout << ef << " " << yo.name << " " << ol.name;
51     return 0;
52 }

 

原文地址:https://www.cnblogs.com/SCP-514/p/13302933.html