题目
题目地址:PAT 乙级 1015
题解
常规题,难点在于理清楚排序规则,通过比较简洁的方式进行编码;
在这里我选择使用vector进行存储,并使用sort方法排序,因为本题不是简单按照大小排序,因此这里需要再次理解sort方法中的第三个参数,以及它的使用细节;
关于sort的具体使用方法,可以在我之前的博文查看;
还需要最后说明的一点问题是:尽量使用 printf 和 scanf,减少 cout 和 cin 的使用,之前用cin和cout,结果时间超限了……
代码
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 struct Stu { 7 int num; 8 int s1; 9 int s2; 10 }; 11 12 bool comp(Stu x, Stu y) { 13 if (x.s1 + x.s2 > y.s1 + y.s2) return true; 14 else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true; 15 else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true; 16 else return false; 17 } 18 19 int main() { 20 vector<Stu> stu1, stu2, stu3, stu4; 21 int tmp_num, tmp_s1, tmp_s2; 22 Stu tmp_stu; 23 int N = 0, L = 0, H = 0; 24 scanf("%d %d %d", &N, &L, &H); 25 while (N--) { 26 scanf("%d %d %d", &tmp_num, &tmp_s1, &tmp_s2); 27 tmp_stu.num = tmp_num; 28 tmp_stu.s1 = tmp_s1; 29 tmp_stu.s2 = tmp_s2; 30 if (tmp_stu.s1 >= L && tmp_stu.s2 >= L) { 31 if (tmp_stu.s1 >= H && tmp_stu.s2 >= H) stu1.push_back(tmp_stu); 32 else if (tmp_stu.s1 >= H && tmp_stu.s2 < H) stu2.push_back(tmp_stu); 33 else if (tmp_stu.s1 < H && tmp_stu.s2 < H && tmp_stu.s1 >= tmp_stu.s2) stu3.push_back(tmp_stu); 34 else stu4.push_back(tmp_stu); 35 } 36 } 37 sort(stu1.begin(), stu1.end(), comp); 38 sort(stu2.begin(), stu2.end(), comp); 39 sort(stu3.begin(), stu3.end(), comp); 40 sort(stu4.begin(), stu4.end(), comp); 41 printf("%d\n", stu1.size() + stu2.size() + stu3.size() + stu4.size()); 42 for (int i = 0; i < stu1.size(); i++) 43 printf("%d %d %d\n", stu1[i].num, stu1[i].s1, stu1[i].s2); 44 for (int i = 0; i < stu2.size(); i++) 45 printf("%d %d %d\n", stu2[i].num, stu2[i].s1, stu2[i].s2); 46 for (int i = 0; i < stu3.size(); i++) 47 printf("%d %d %d\n", stu3[i].num, stu3[i].s1, stu3[i].s2); 48 for (int i = 0; i < stu4.size(); i++) 49 printf("%d %d %d\n", stu4[i].num, stu4[i].s1, stu4[i].s2); 50 51 return 0; 52 }
这里的代码感觉还是有些冗余,尤其是排序和输入的部分,因此再贴上经过微小改进后的代码;
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 struct Stu { 7 int num; 8 int s1; 9 int s2; 10 }; 11 12 bool comp(Stu x, Stu y) { 13 if (x.s1 + x.s2 > y.s1 + y.s2) return true; 14 else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 > y.s1) return true; 15 else if (x.s1 + x.s2 == y.s1 + y.s2 && x.s1 == y.s1 && x.num < y.num) return true; 16 else return false; 17 } 18 19 int main() { 20 vector<Stu> stu[4]; 21 int tmp_num, tmp_s1, tmp_s2; 22 Stu tmp_stu; 23 int N = 0, L = 0, H = 0; 24 scanf("%d %d %d", &N, &L, &H); 25 while (N--) { 26 scanf("%d %d %d", &tmp_num, &tmp_s1, &tmp_s2); 27 tmp_stu.num = tmp_num; 28 tmp_stu.s1 = tmp_s1; 29 tmp_stu.s2 = tmp_s2; 30 if (tmp_stu.s1 >= L && tmp_stu.s2 >= L) { 31 if (tmp_stu.s1 >= H && tmp_stu.s2 >= H) stu[0].push_back(tmp_stu); 32 else if (tmp_stu.s1 >= H && tmp_stu.s2 < H) stu[1].push_back(tmp_stu); 33 else if (tmp_stu.s1 < H && tmp_stu.s2 < H && tmp_stu.s1 >= tmp_stu.s2) stu[2].push_back(tmp_stu); 34 else stu[3].push_back(tmp_stu); 35 } 36 } 37 printf("%d\n", stu[0].size() + stu[1].size() + stu[2].size() + stu[3].size()); 38 for (int i = 0; i < 4; i++) { 39 sort(stu[i].begin(), stu[i].end(), comp); 40 for (int j = 0; j < stu[i].size(); j++) 41 printf("%d %d %d\n", stu[i][j].num, stu[i][j].s1, stu[i][j].s2); 42 } 43 44 return 0; 45 }
这样整体代码就简洁了一些,看起来也没有那么臃肿