中国大学MOOC-数据结构基础习题集、08-1、Talent and Virtue
题目链接:http://www.patest.cn/contests/mooc-ds/08-1
题目分析:这是一道考察排序算法的一道题。如果对题目不懂的话,这里恰巧有一个中文题目,不妨看一下:
http://www.patest.cn/contests/pat-b-practise/1015
特别说明:
1. 这道题有一个很大的坑,如果用C++的cin和cout运行会超时。要使用C语言的scanf和printf。博主也是看了别人的博客才发现问题所在。如果你的用例3和用例4超时的话,不妨更改一下。
2. 建立4个vector,分别存圣人、君子、愚人、小人的信息。对每个vector的排序算法相同:先总分降序、再德分降序、再准考证号升序。因此,排序函数是本道题的重点,解决了排序问题,也就解决了这道题。博主这里使用的是标准库中是sort函数,使用方法非常简单:
1 sort(vec1.begin(), vec1.end(), cmp); 2 // 以下省略其他3个vector
关键是如何编写cmp函数,这里我们按照题目的需求,编写cmp函数如下:
1 int cmp(const node &x, const node &y) 2 { 3 int scoreA = x.b + x.c; 4 int scoreB = y.b + y.c; 5 if (scoreA != scoreB) 6 return scoreA > scoreB; 7 else 8 { 9 if (x.b != y.b) 10 return x.b > y.b; 11 else 12 return x.a < y.a; 13 } 14 }
3. 其实博主这里偷懒了,没有自己写排序函数。事实上,标准库的排序函数(sort,qsort,stable_sort)在大多数情况都能满足我们的需求。如果能借助现有的函数(或工具)能简化我们的编码,既能提高我们的编码效率,又能让别人更容易读懂我们的代码,出错率低、可移植性高,那么何乐而不为呢?当然,对于“数据结构”这门课程来言,其实还是推荐大家自己编写代码的。
代码分析:
- 头文件声明及结构体的定义:1~16
- cmp函数的定义(核心):17~30
- 处理输入部分,并判断是圣人、君子、愚人或小人,放入对应vector里:31~55
- 调用排序函数,输出最后结果:56~70
1 #include <cstdio> 2 #include <algorithm> 3 #include <vector> 4 5 using namespace std; 6 7 struct node 8 { 9 int a, b, c; 10 node(int x, int y, int z):a(x), b(y), c(z) {} 11 void output() 12 { 13 printf("%d %d %d\n", a, b, c); 14 } 15 }; 16 17 int cmp(const node &x, const node &y) 18 { 19 int scoreA = x.b + x.c; 20 int scoreB = y.b + y.c; 21 if (scoreA != scoreB) 22 return scoreA > scoreB; 23 else 24 { 25 if (x.b != y.b) 26 return x.b > y.b; 27 else 28 return x.a < y.a; 29 } 30 } 31 32 int main() 33 { 34 int n, l, h; 35 scanf("%d%d%d", &n, &l, &h); 36 vector<node> vec1; 37 vector<node> vec2; 38 vector<node> vec3; 39 vector<node> vec4; 40 for(int i=0; i<n; i++) 41 { 42 int a, b, c; 43 scanf("%d%d%d", &a, &b, &c); 44 if(b < l || c < l) 45 continue; 46 if(b >= h && c >= h) 47 vec1.push_back(node(a, b, c)); // 圣人 48 else if(b >= h && c < h) 49 vec2.push_back(node(a, b, c)); // 君子 50 else if(b < h && c < h && b >= c) 51 vec3.push_back(node(a, b, c)); // 愚人 52 else 53 vec4.push_back(node(a, b, c)); // 小人 54 55 } 56 printf("%d\n", vec1.size() + vec2.size() + vec3.size() + vec4.size()); 57 sort(vec1.begin(), vec1.end(), cmp); 58 sort(vec2.begin(), vec2.end(), cmp); 59 sort(vec3.begin(), vec3.end(), cmp); 60 sort(vec4.begin(), vec4.end(), cmp); 61 for(int i=0; i<vec1.size(); i++) 62 vec1[i].output(); 63 for(int i=0; i<vec2.size(); i++) 64 vec2[i].output(); 65 for(int i=0; i<vec3.size(); i++) 66 vec3[i].output(); 67 for(int i=0; i<vec4.size(); i++) 68 vec4[i].output(); 69 return 0; 70 }
AC成果: