• 【经典算法学习-排序篇】顺序查找 - 作业讲解


    目录

    一、通观题目,找准考察方向 

    二、题目讲评

    1.有一门课不及格的学生

    2.不定方程求解

    3.子串变换

    三、总结规律,探索发现

    1.程序的多样性

    2.思维的提升


    一、通观题目,找准考察方向 

    有一门课不及格的学生 - 洛谷

    不定方程求解 - 洛谷

    [NOIP2002 提高组] 字串变换 - 洛谷(较难)

     很明显,在读完题后,我们都有一种明显的感觉:这考察的不就是顺序查找吗?

    顺序查找,也就是线性查找,指逐个查找。记住这句话后,我们来看是看题吧。

    二、题目讲评

    1.有一门课不及格的学生

    这道题目可以堪称为顺序查找的模板题了。

    这道题要求判断学生的不及格科目的总数,所以我们可以定义一个变量sum来求。如何判断是否不及格?判断的依据就是如果没有到60分就是不及格,这也正是我们的if语句了。

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //定义语文、数学、英语三个变量并输入
    6. int chinese, math, english;
    7. cin >> chinese >> math >> english;
    8. //用来求有多少科目不及格
    9. int sum = 0;
    10. //判断有多少门科目不及格
    11. if (chinese < 60)
    12. sum++;
    13. if (math < 60)
    14. sum++;
    15. if (english < 60)
    16. sum++;
    17. //判断是否为1门科目不及格
    18. if (sum == 1)
    19. cout << "1" << endl;
    20. else
    21. cout << "0" << endl;
    22. return 0;
    23. }

    这道题不同于我们例题中的顺序查找,没有用到循环。所以,我们对于线性查找又多了一层认知:线性查找不必非要使用循环来解决,只要按照一条线的进行查找就可以算是线性查找。

    2.不定方程求解

    这道题其实就是一道让我们解方程的题。解方程的题还不简单?直接奉上我们的暴力枚举不就可以AC了吗?

    那么,让我们思考一下如何枚举。首先,我们要枚举的一定是x和y的值,这点是毋庸置疑的。那么,枚举的边界条件是什么?一定是 x\leq c 和 y\leq c 了。有了这些思路,我们的代码也就能轻而易举的写出来了。

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. //按照题意输入
    6. int a, b, c;
    7. cin >> a >> b >> c;
    8. //用来记录一共有多少种情况
    9. int sum = 0;
    10. //开始暴力枚举
    11. for (int x = 0; x <= c; x++)
    12. {
    13. for (int y = 0; y <= c; y++)
    14. {
    15. if (a * x + b * y == c)
    16. {
    17. sum++;
    18. }
    19. }
    20. }
    21. //输出有多少种情况
    22. cout << sum << endl;
    23. return 0;
    24. }

    这道题让我们明白了什么?首先,就是要大胆的去写。不管会不会超时,一定要先尝试像这样搜索一下。其次,顺序查找是可以多重循环的。

    这也变相说明了暴力枚举的本质就是线性查找

    3.子串变换

    这道题相较于前两道题而言,那么就相当于是世界难题了。这是一道NOIP提高组的试题,足以见得它的难度。这道题是对于线性查找的一个扩展,使用了BFS来解决问题。

    这道题如果对于新手的话,可能会不太友好,所以这道题就不会讲解了。如何想要掌握这道题的,那么可以阅读以下代码,摸索出答案。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. map int> zt;
    9. queue que;
    10. string st, ed, x[1001], y[1001];
    11. int tot = 1, ans;
    12. bool eq(string s, int be, int to)
    13. {
    14. string &tmp = x[to];
    15. if (s.size() - be + 1 < x[to].size())
    16. return false;
    17. for (int i = be; i - be < tmp.size(); i++)
    18. {
    19. if (s[i] != tmp[i - be])
    20. return false;
    21. }
    22. return true;
    23. }
    24. string change(string s, int be, int to)
    25. {
    26. if (eq(s, be, to))
    27. {
    28. string neww = s.substr(0, be) + y[to] + s.substr(x[to].size() + be, s.size());
    29. return neww;
    30. }
    31. else
    32. return "";
    33. }
    34. int bfs()
    35. {
    36. que.push(st);
    37. zt[st] = 0;
    38. while (!que.empty())
    39. {
    40. string now = que.front();
    41. que.pop();
    42. for (int i = 0; i < now.size(); i++)
    43. {
    44. for (int j = 1; j <= tot; j++)
    45. {
    46. string neww = change(now, i, j);
    47. if (neww == "")
    48. continue;
    49. if (zt.count(neww))
    50. continue;
    51. if (zt[now] + 1 > 10)
    52. continue;
    53. que.push(neww), zt[neww] = zt[now] + 1;
    54. if (neww == ed)
    55. return zt[now] + 1;
    56. }
    57. }
    58. }
    59. return 0;
    60. }
    61. int main()
    62. {
    63. cin >> st >> ed;
    64. while (cin >> x[tot] >> y[tot])
    65. {
    66. tot++;
    67. }
    68. tot--;
    69. ans = bfs();
    70. if (!ans)
    71. printf("NO ANSWER!");
    72. else
    73. printf("%d", ans);
    74. return 0;
    75. }

    咋样,我没骗你吧!这道题是不是难了很多!

    三、总结规律,探索发现

    从上述的三道题中,我们发现了什么规律?

    1.程序的多样性

    使用一种思想来做题,程序可能会迥然不同 。在顺序查找中,可能程序中没有循环,也可能一下子出现五个循环嵌套。这也是为什么我们顺序查找的题目没有模板的原因。

    2.思维的提升

    通过这三道题,我们的思维提升了,我们又学会了换一种方法思考问题。思考问题的方式多种多样,如果一道题目不会的话,不妨换一种方式来思考,你或许会获得新的收获。

  • 相关阅读:
    Python语法--for、while循环操作
    期货开户公司底蕴深厚实力强大
    [鹏程杯2023]复现
    GNN+RA 文献阅读
    钉钉7.5版本多项产品升级,打造年轻人爱用的AI工具
    Android 9.0系统源码_SystemUI(三)系统状态图标控制
    测试/开发程序员的焦虑,感激痛并快乐着......
    案例 | 美创助力镇海区大数据发展管理中心构建“数改”安全防护力
    【学习记录】调试千寻服务+DTU+导远RTK过程的记录
    LeetCode39 组合总和
  • 原文地址:https://blog.csdn.net/Wanghs0716/article/details/126224722