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 }
默默地一点点变强,细节决定成败