20200613-04 PAT 甲级试题 03 List Grades

ゝ一纸荒年。 2023-02-17 11:18 104阅读 0赞

思路讲解

本题的核心在于排序(降序)
所以可以选用比较常见的几种排序算法,如冒泡,快排,插入,选择等等
快速排序详解
冒泡法详解
插入排序法

这里选用递归类型的快速排序法,具体详细看代码

源码

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <vector>
  5. #include <tuple>
  6. #include <iostream>
  7. using namespace std;
  8. void sort_quick_r(vector<tuple<string, string, int>> & array, int left, int right)
  9. {
  10. int tmp = get<2>(array[left]);
  11. auto v = array[left];
  12. int p = left;
  13. int i = left, j = right;
  14. while (i <= j) {
  15. while (get<2>(array[j]) <= tmp && j >= p)
  16. j--;
  17. if (j >= p) {
  18. array[p] = array[j];
  19. p = j;
  20. }
  21. while (get<2>(array[i]) >= tmp && i <= p)
  22. i++;
  23. if (i <= p) {
  24. array[p] = array[i];
  25. p = i;
  26. }
  27. }
  28. array[p] = v;
  29. if (p - left > 1)
  30. sort_quick_r(array, left, p-1);
  31. if (right - p > 1)
  32. sort_quick_r(array, p+1, right);
  33. }
  34. int main() {
  35. int n_counts { 0};
  36. int max_grade { 0}, min_grade { 0};
  37. //这个是 C++ 的一个类型 tuple 一个结构体,具体可以查找官方文档
  38. vector<tuple<string, string, int>> student_records;
  39. //读取输入值
  40. scanf("%d", &n_counts);
  41. char temp_name[10];
  42. char temp_id[10];
  43. int temp_grade { 0};
  44. while (n_counts--) {
  45. scanf("%s %s %d", temp_name, temp_id, &temp_grade);
  46. student_records.push_back(make_tuple(temp_name, temp_id, temp_grade));
  47. //对于两个数组进行初始化
  48. memset(temp_id, 0, sizeof (temp_id));
  49. memset(temp_name, 0, sizeof (temp_name));
  50. }
  51. scanf("%d %d", &min_grade, &max_grade);
  52. //排序 降序
  53. sort_quick_r(student_records, 0, student_records.size() - 1);
  54. //去除数据范围之外的数据
  55. //记录打印数量
  56. auto printf_count { 0};
  57. for (const auto & temp : student_records) {
  58. auto _grade = get<2>(temp);
  59. //打印满足要求的值
  60. if (_grade <= max_grade && _grade >= min_grade) {
  61. cout << get<0>(temp) << " " << get<1>(temp) << endl;
  62. printf_count++;
  63. }
  64. }
  65. //没有任何符合要求的项,输出 NONE
  66. if (0 == printf_count) {
  67. cout << "NONE" <<endl;
  68. }
  69. return 0;
  70. }

推荐课程

尹成老师带你学算法

数据结构核心原理与算法应用

发表评论

表情:
评论列表 (有 0 条评论,104人围观)

还没有评论,来说两句吧...

相关阅读