2020年acm课程总结

acm课程总结

转眼之间,一个学期就要这么过去了,ACM课程也算是圆满的落下了帷幕,经过这一学期的学习,感觉自己有了很大的成长和巨大的收获,自己也对c++语言有了重新的一个认识和定义,原本上程序设计这门专业必修课时觉得很简单,但真正深入了解了一些算法和一些做题的思想之后,就觉得课本上学的那些也只是些皮毛而已!如果不学ACM,恐怕我觉得会和大多数同学一样,也就简单是这个计算机中的普通了解者罢了。我很庆幸我没退这门课,并且坚持了下来!下面,我来介绍一下本人学习ACM课程与设计的学习心得!

我最早了解acm的时候,也就是大二学长学姐来给我们做宣讲的时候才了解的,初入大学面对一切都很好奇。因为是专业领域的社团嘛,所以就听得还挺认真的,也比较感兴趣。之后就加入了社团,参加了新生比赛,一开始还觉得自己还挺牛呢,信心满满去比赛,结果可真菜。后来一直在看《信息学奥赛一本通》的一本书,开始有点进阶的学习看题,没什么方法,也只是看题解,基本还可以看懂。也是因为感觉自己有能力能学会,所以acm这门课并没有退。老实说,在大学里面全心全意去投入一件事情是蛮困难的,但是很多学长学姐也是0基础到很不错的水平的,而且既然选了这个专业就要多多深入了解嘛。如果没去了解acm,那将会是我大学里面一个非常大的遗憾,自己就不会再专业必修课中学的游刃有余,可能会有点吃力。通过acm自己提前接触很多算法,和很多写代码的思维,这对在这个领域里面也是起到很重要作用的。

寒假期间,因为疫情的原因我们从没真正在课堂上面用熟悉的学习方式去学习这门课,因为网络授课的原因,让我对这个专业领域更加充满兴趣,因为在家有充足的的时间去自己了解学习知识,所以疫情开始的焦躁大大减少,转而是面对动态规划题目的无奈……

从最开始的来讲吧,回忆起来,最开始学的应该是stl内容,(stl即标准模板库又称c++泛型库)从根本上来说stl是一些"容器"的集合,当然还有迭代器和算法组件,使用起来非常方便。个人感觉像是一种偷懒方式叭,就是前辈写的代码封装到某个头文件中,让我们这些小白偷偷懒,拿sort这个简单的排序例子来讲,在程序设计这门课中,课本上面有讲什么冒泡排序,快速排序,,最开始我看起来还有点困难,看了好几遍才理清思路的,起的名字都挺新颖的,就会让人好奇想了解,了解之后觉得起的名字都很生动贴切。sort排序我之前写博客的时候也有深度了解一些,sort函数内部的函数其实就是用快速排序,选择排序多种排序进行按照你要排序的内容自主选择合适的方式,运用其中一种或者多种去进行排序。当然啦,要加一个头文件algorithm。再有就是string字符串类型的基本类,充分减少了使用char数组的某些可能出错的点,比如在我们学的程序设计课中,运用面向对象法写代码时,用char数组就有必要写new和delete,而用string类就可以适当减少不必要的马虎出错。再就是向量vector,对他进行插入删除操作要比数组方便的多,完全可以代替数组。
栈和队列肯定是少不了的两种数据结构,做栈和队列的题最开始的是一类括号匹配问题,我记得那是第一次写特别长特别长的代码,用empty函数时出了点小错误,其他的没啥问题,做栈和队列的题也是比较多的,牢牢记住stack(栈)的先进后出和queue(队列)的先进先出;还有一种优先队列(priority_queue)它可以自动依照元素的权值进行排列,权值对高德排在前面。
对于map是我在请教学长问题的时候学习到的,最开始还并没有听过这个词,map是一种映射,所有的元素都是pair,pair的第一个元素称为键值,第二个元素称为实值,我最开始不理解的时候就是把map当做一种下标可以改变的数组看待的,例如map<char,int>p;就可以看做下标是char类型的数组,multimap和map的不同点就在于map不允许两个元素有相同的键值,但multimap可以。除此之外还有集合set和multiset,区别和map那组类似,set不允许元素重复。

对于迭代器:个人理解就是类似数组下标一样,他可以用来遍历标准模板库中的部分或全部元素,迭代器有输入迭代器,输出迭代器,前向迭代器,双向迭代器等。对我们平时对元素的操作有很大的便利,使用反向迭代reverse_iterator可以反向遍历集合,输出的结果正好是集合元素的反向排序结果,他需要用到rbegin()和rend()两个方法,它们分别给出了反向遍历的开始位置和结束位置;在二分法的学习中,运用的左右两个下标的方式就像双向迭代器,还有在图论树中的先序排列,中序排列,后序排列也需要这种下标转变的概念吧,一不留神把父节点和子节点弄混了就容易陷进去,整个题目就会很混乱。
对于算法,最开始我以为像递推算法,贪心算法才是算法,但我们最开始学的比较函数(compare)交换函数(swap)查找(find)等等也是算法主要存在于头问件algorithm中;但是这类算法只是给我们提供便利的,真正做题能运用到的算法还是靠思想思路的贪心算法等。

拿递归这类比较简单的来讲吧,递推公式相对于动态规划的状态转移方程要简单的多,其实递推公式也是动态转移方程的一个基础;递归算法是我写代码第一个觉得神奇的点,就是他可以在你没弄清楚复杂问题时,用简单的每次调用自身函数就可以得出你手算算不出且正确的答案,(这里递归递推如果最开始的我来看会有些混淆,但其实并递推算法呢就是要用递归来实现的)。
第二个神奇的点当数动态规划了,最开始学习动态规划还是看的学长推荐的书,《挑战程序设计竞赛》,里面对每种专题讲解的还是很详细的,特别是有表格做辅助,第一次真正理解到其中神奇的点,还是01背包,最开始是照着书上的代码自己写了一遍运行,运行答案和书的答案肯定是一样的,但我并不知道答案怎么运算出来的,我也不知道答案的准确性,所以就先自己手算算出答案(给的样例是比较小的数字,脑袋稍微动动还是可以算出来的。)印证答案正确后就觉得很神奇,最后也是用笨方法按照代码的运行自己在本子上面写下了每一步循环的过程(没什么巧妙的方法,确实这个笨方法是管用的)。后来接触到完全背包,多重背包,还有其他形式的动态规划问题,总的思路就是找到子问题用数组去记录子问题的答案,找到状态转移方程,用小问题的最优解去找到最终问题的答案,其中还包含着贪心的思想在里面。在我看来动态规划是最难得部分了,简直难到让我怀疑人生啊,正因如此他也是acm中最重要的部分。很多人退课也差不多是败在了动态规划上面的,其实动态规划就是解决多阶段的问题,每个阶段都有相应的状态和决策,选择不同的决策会影响下一个阶段的最优状态,这一阶段与再下一阶段会有相同的结构,找到准确的状态转移方程就得到最优解了。(说起来确实轻松,但状态转移方程不在小本本上划一划还是挺难确定的)

数论算法在打cf中应该是蛮实用的,虽然我现在还没准确运用进cf中去,因为打cf做题总是超时,运用数论算法才会解决这一点,之前看题解时有不理解的巧妙算法也是在数论算法中的,还有精确度的问题,之前程序设计课做题时有个求方程解的问题,我记得我当时觉得很简单但是提交就是不对,就是精确度的问题,当时请教的学长,但是只是记了记代码,自己当时没怎么搞懂,很庆幸选修了acm这门课,不然再让我做那道题估计我还是不会的。

虽然课程结束了,但是我的这条专业路线还有很长的路要走的,这条路不允许懒惰不允许拖延,既能改变自己生活上的小缺点又可以学到自己所感兴趣的知识,而且还能够锻炼自己的思维,真的是没有理由不去坚持!

(5.25先记录一波实验课后再续一点实验课总结……)
实验课进行了两周,最先在牛客网打了一次比赛,ac了两个题,看了题解,感觉应该可以过四个题的,这次比以往要涨经验,因为基本所有题都看了一遍然后选择相应的题做的,这一点在之前打cf是不怎么常有的。有一道超出long long范围的题,之前做过类似的题,之前是用字符数组记录数字的,这次也用了这种办法然后用的推算的公式相乘,但是写了很长的代码最后运行不正确,看了题解之后了解了大数相乘,也是用数组来记录数字,如果时间长一点的话我那个代码应该可以过。接下来是进行了一次vj模拟cf的比赛ac了三道题都是很水的题没什么难度,比赛之后看了后三个题的题解,水平确实达不到五题六题的水平,但相信之后是会更有进步的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值