学习ACM感想
大二上半学期,由于报了大学生电子商务竞赛而进入实验室。在大一时,比较迷茫,不知道自己的专业什么内容重要,什么内容不重要。所以在大一下半学期学习C语言这门最基础的程序设计课的时候,老师上课在讲自己也不认真听讲。觉得只要考试能过就行了。结果考试是过了,但对于C语言还是一窍不通。
在大二下班学期,由于选了面向对象程序设计和数据结构,老师的内容不怎么听的懂。开始认识到C语言的重要性,自己从头开始自学,把非计算机专业的C语言借来看,慢慢的赶上去,不懂的就问问同学。把书认真的看了两遍后,再接触接触计量OJ上的题目提高一下自己。就这样我开始接触了ACM。ACM=算法+数据结构。第一次接触ACM,刚开始做简单题的时候我也感觉并不容易,比如有些英文题目看起来比较费劲,要看很久才能搞清楚题目意思,有时候简单题目交上去不正确,题目有很多trick,有时候代码看多了,人就会觉得很厌倦和郁闷,但是不要灰心,我觉得做什么事贵在坚持,只要坚持下来,就会越来越体会到ACM 的无穷乐趣了。后来自己独立思考,把一些没有算法的题目基本上都提交成功了。也觉得有一些成就感,从一点都不会到现在能把一些简单的题目解决。有算法的题目,就自己
百度或查一些资料,由于没有老师的指导,有些算法还是模棱两可。在数据结构的课上,老师也给我们介绍了一些算法。
下面是我自己总结的算法:
一.基本算法:
(1)枚举.
(1)枚举.
(2)贪心
(3)递归和分治法
(4)递推
(5)构造法
(6)模拟法
二.图算法
(1)图的深度优先遍历和广度优先遍历.
(2)最短路径算法
(3)最小生成树算法
(3)递归和分治法
(4)递推
(5)构造法
(6)模拟法
二.图算法
(1)图的深度优先遍历和广度优先遍历.
(2)最短路径算法
(3)最小生成树算法
(4)拓扑排序
(5)二分图的最大匹配
(6)最大流的增广路算法(KM算法)
三.数据结构
(5)二分图的最大匹配
(6)最大流的增广路算法(KM算法)
三.数据结构
(1)串
(2)排序(快排、归并排(与逆序数有关)、堆排)
(3)简单并查集的应用.
(4)哈希表和二分查等高效查法
(2)排序(快排、归并排(与逆序数有关)、堆排)
(3)简单并查集的应用.
(4)哈希表和二分查等高效查法
(5)哈夫曼树
(6)堆
(7)trie树(静态建树、动态建树)
四.简单搜索
(1)深度优先搜索
(2)广度优先搜索
(6)堆
(7)trie树(静态建树、动态建树)
四.简单搜索
(1)深度优先搜索
(2)广度优先搜索
(3)简单搜索技巧和剪枝
五.动态规划
五.动态规划
(1)背包问题.
(2)型如下表的简单DP
1.E[j]=opt{D+w(i,j)}
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
(1)组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(2)数论.
1.素数与整除问题
2.进制位.
(2)型如下表的简单DP
1.E[j]=opt{D+w(i,j)}
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
(1)组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系.
(2)数论.
1.素数与整除问题
2.进制位.
3.同余模运算.
(3)计算方法.
1.二分法求解单调函数相关知识
七.计算几何学.
(1)几何公式.
(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等).
(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
1.二分法求解单调函数相关知识
七.计算几何学.
(1)几何公式.
(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等).
(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)
(4)凸包.
对上述一些排序算法能熟练的掌握。对于其他的一些算法,原理我还是比较熟悉的,要把书上长长的代码转化为自己的代码运用到题目中,还是觉得很难。
学算法有一个很重要的方法:每学一种算法的时候可以先看书或者上网查,搞清楚原理之后,可以从OJ上一些这类算法的简单题做,然后对这个算法比较熟了之后就可以一些这种算法的变形等比较难的题目做,每做完一个题目我都会在代码旁边写好注释用word文档存起来,定期把文档打印出来。或者可以写下这题的解题报告,说明用什么算法做的,
学算法有一个很重要的方法:每学一种算法的时候可以先看书或者上网查,搞清楚原理之后,可以从OJ上一些这类算法的简单题做,然后对这个算法比较熟了之后就可以一些这种算法的变形等比较难的题目做,每做完一个题目我都会在代码旁边写好注释用word文档存起来,定期把文档打印出来。或者可以写下这题的解题报告,说明用什么算法做的,
要注意什么问题,便于以后要看时能够快速理解。还有对于ACM程序设计不仅要求你做的题目要多,还要求你的代码长度和运行时间,所以要去研究别人的代码为什么比你短,运行时间为什么比你少。这样你才能有更大的进步。
要了解一些头文件的用处:
学javascript前要学什么 1、<assert.h>设定插入点
2、<ctype.h> 字符处理
3、<errno.h>错误报告
4、<float.h>浮点数处理
5、<limits.h> 定义与实现相关的各种极限值
6、<locale.h>定义本地化函数
7、<math.h> 数学函数库使用的各种定义
8、<setjmp.h> 支持非局部跳转
9、<signal.h> 定义信号值
10、<stdarg.h> 支持可变长度的变元列表
11、<stddef.h> 定义常用常数
12、<stdio.h> 支持文件输入和输出
13、<stdlib.h>定义杂项函数及内存分配函数
14、<string.h>字符串函数处理函数
15、<time.h> 支持系统时间函数
16、<complex.h> 支持复数算法
17、<fenv.h>给出对浮点状态标记和浮点环境的其他方面的访问
18、<inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数
19、<iso646.h>用于定义对应各种运算符的宏
20、<stdbool.h>布尔数据类型类型。
21、<stdint.h> 标准的、可移植的整型类型集合。该文件包含在<inttypes.h>中
22、<tgmath.h> 一般类型的浮点宏
23、<wchar.h>用于多字节和宽字节函数
24、<wctype.h>用于多字节和宽字节分类函数
25、<fstream.h> 文件输入和输出
26、<iomanip.h> 参数化输入和输出
27、<iostream.h> 数据流输入和输出
C语言中要用到的头文件我基本上都已经总结出来了,要掌握经常用到的头文件(<ctype.h>、<string.h>、<stdlib.h>、<stdio.h>、<fstream.h>、<math.h>),不经常用
到的要知道有这样一个头文件存在。如果真的要用到你能在网上查的到就够了。
我们现在用的编译器都是Microsoft Visual C++ 6.0,关于编程的时候还有一些小问题要注意:
我们现在用的编译器都是Microsoft Visual C++ 6.0,关于编程的时候还有一些小问题要注意:
1、 拼写单词的时候要注意,还要注意单词的大小写。
2、 一些符号要注意,不要把“==”写成赋值符号“=”,还有分号不要漏写。这是我经常犯的错误。
3、 oj上编辑器的问题,有写题目用C++超时,用G++却神速无比,有时候又反过来,所以一些题目不妨用两个编辑器都交一下。又比如说一些涉及精度的题只有用C++交才能提交。
4、 还应该注意题目的要求,它要你用int,你就别用double或者float这样你都是不能提交正确的。
在实验室一个学期,真的收获了很多,不管是人际关系还是学到的知识。在实验室认识了
很多各方面的精英。在实验室尽管ACM没人教你,你花费的时间会更多。但你自己研究出来的东西会更有价值,让你印象更加深刻。以后到工作岗位上去也一样,你不可能什么问题都问自己的同事,能解决都要自己去解决,实在是解决不了的在再问问别人。希望下个学期能够参加一些程序设计的比赛,锻炼一下自己,使自己能够真正的进步。
自己计划在学期去参加比赛,从学长那边了解到要参加程序设计的经验:
1) 重视团队合作:ACM的灵魂在于算法以及团队合作,没有了团队合作,除非有超强的个人能力,否则是很难取得很好的成绩的,在很多情况下,一个人出错的概率远远超过2个人以上一起做题,而在比赛中,出一点小错和一次成功YES的区别是非常大的,不只有罚时,更是心理上的区别,所以保证良好的团队合作,对比赛是至关重要的,在我自己的比赛中,两次的比赛,一次合作的好,一次合作的乱,直接导致了金和铜的区别。
2) 平时做好准备:在赛后颁奖的时候,亚洲区负责人黄金雄教授曾说,在地区赛中,要取得一个金牌,至少需要1000个题目的积累,银牌也需要500个,可见练习是ACM里非常重要的一个环节,很多小问题,不错过并自己改正过,是很难在比赛中发挥出来的。而那些能走的世界舞台甚至拿下前几名的选手,都曾经作过2000以上甚至3000个题目,当然,
题目的数量不能代表一切,质量也很重要,各种类型都做,难题,中等题混着做,对实力的进展有很大的帮助。同时,一般高手都会有属于自己的库,可以是交流来的别人写的,也可以是自己写的,一般提议自己写过,不过需要多次验证正确性,如果采用别人的,肯定正确的代码,必须先仔细的看明白,才能在比赛中能够用上,做点小修改等等。
3) 赛前调整好心理状态:在比赛前,如何调整好心理状态,睡眠不足,过度兴奋,是比赛中非常忌的事。对于我本人,这方面存在着比较大的问题,赛前无法入睡,有类似情况的话,比赛时应该用点西洋参等提神的物品来弥补上精神不足的问题,吉林时,比赛前2天我都没能入睡,多亏了赛前集训队老师的西洋参,使得比赛中保持了一定的状态,到最后,头非常晕的情况下还能写出代码。
4) 比赛时候注意细节:在比赛中,边界数据,数据范围等等同样重要,同时,注意别人的比赛情况,不要只管自己做,多注意别人做出了什么问题,并加以参考。
5) 比赛的时候注意状态调整:比赛时,人是非常累的,同时,不能补充上午饭是非常大的一个身体考验,所以,ACM中,不只是比的能力,也很考虑身体素质,如何把自己的状态调整好,发挥出比较好的势力很有讲究,晕了吃点巧克力(不要是饭,面包等很需要消化
的东西),多洗洗脸,可以让人尽可能的保持在清醒状态。
6) 训练好的心理素质:ACM比赛中,成绩好的一定是高手,成绩差的却不一定都实力不够,即使有非常好的实力,比赛中失利也是非常正常的事,如何调整好赛后心情,虽然有时候对比赛已经没有影响,却比比赛本身更为重要。
还有在下学期开始学习一些网页制作;俗话说:不能把所有的鸡蛋放在一篮子里。作为一个大学生应该了解更多的东西,这样你就业的机会就会比别人多。这样就不愁不到工作。
计划: 先学一学HTML,本自己能看懂的教材,浏览为主,不用记住所有的概念,把使用原理记住,然后用学CSS,方法同上;进而再花些时间了解一下javascript。 然后就可以用记事本尝试写几个网页。同学告诉我“写网页”的捷径,就是上各大网站,把网页保存下来,然后打开保存下来的网页,点击右键→查看源文件,看看人家的网页是怎么写的,然后模仿他们的写法,不断规范自己的代码。
接下来该学一下Fireworks了,到网上一些详细的实例教程,跟着它一步一步做下来,
每学会一个实例就掌握了几项操作,慢慢的就会有自己的作品,很有成就感的,长期积累下来对自己的提高很有帮助。学Fireworks主要是学图片处理,比如加一些效果,还有很重要的就是切图。这时结合Dreamweaver进行学习,利用这些工具多做几个网页,就可以达到一定水平了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论