浅谈大学参加程序竞赛

浅谈大学参加程序竞赛

  • 一、程序竞赛的类别
  • 程序设计涉及知识点
    • 初期:
      • 一.基本算法:
      • 二.图算法:
      • 三.数据结构.
      • 四.简单搜索
      • 五.动态规划
      • 六.数学部分
        • 组合数学:
        • 数论:
    • 中级
      • 一.基本算法
      • 二.图算法
      • 三.数据结构
      • 四.搜索
      • 五.动态规划
    • 高级
        • 一.图算法
        • 二.数据结构.
        • 三.搜索
        • 四.动态规划
        • 五.综合题.
  • 参加程序设计训练心得
  • 训练心态问题
  • 组队建议
  • 如何平衡训练和其他课程学习
  • 参加程序设计比赛对自己的作用
  • 学院程序设计训练方法和模式的建议
  • 学习平台推荐

一、程序竞赛的类别

进入大学,意味着不必像高中那样每天要做很多的题,尽管是全日制教学,实际上你还是会有很多的课余时间,比如周末,比如没有课的下午,比如每天晚上寝室关门前都是你的课余时间。

作为计算机系的学子,可能很多学校都会要求有参加竞赛经历。那么作为计算机系的在大学你可以参加那些相关的竞赛呢?
根据我的经历,大致有以下竞赛可以参加:

  1. 学院组织的院级程序竞赛。
    参加学院组织的程序竞赛可以让你从同年级的人中脱颖而出,有机会被学院选中进行重点培养,作为程序竞赛储备人才以参加其他的程序竞赛。竞赛时间不详(每个学校的竞赛时间都不一样,就算是同一个学校,可能也会因为老师的工作而变动)

  2. 学校组织的校级程序竞赛。
    参加学校组织的程序竞赛,和参加学院组织的程序竞赛是一样的,拿到第一名的意义就是你成功的从同年级校友中脱颖而出,在这样的比赛中让学校领导看到你的光芒。不是所有的学校都会组织程序竞赛,很多学校都是计算机系学院组织选拔人才,学校不会组织。或者直接是学校组织。不管谁组织,目的都是为后面的省级程序竞赛选拔人才。竞赛时间和院级的程序竞赛一样。

  3. 省级的程序竞赛。
    当你从学院或者学校组织的程序竞赛中崭露头角后,会进行规律的训练,以参加省级的程序竞赛。一般来说省级的程序竞赛就是ACM程序竞赛的预选赛。在省级的程序竞赛中,你可以有机会见识同省其他高校学生的程序设计水平,如果你擅长交流还可能交到其他学校的编程爱好者。在省级程序竞赛中斩获奖励的话,在以后找工作的过程中也会有不错的砝码。当你在省级竞赛中成功击败其他对手,你便有机会参加ACM大学生程序设计竞赛。竞赛时间可以关注各省的计算机协会官网。一般官网都会发布竞赛公告。

  4. ACM大学生程序设计竞赛。
    这个比赛是国际性的,不过分区域。赛事由各大洲区域预赛和全球总决赛两个阶段组成。决赛安排在每年的3-5月举行,而区域预赛一般安排在上一年的9-12月举行。原则上一个大学在一站区域预赛最多可以有3支队伍,但只能有一支队伍参加全球总决赛。作为中国的大学生,参加的当然是亚洲赛区的预赛选拔啦!
    竞赛进行5个小时,一般有7道或以上试题,由同队的三名选手使用同一台计算机协作完成。程序判定结果有如下7种:
    a、Accepted. ——通过!(AC)
    b、Wrong Answer.——答案错。(WA)
    c、Runtime Error.——程序运行出错,意外终止等。(RE)
    d、Time Limit Exceeded. ——超时。程序没在规定时间内出答案。(TLE)
    e、Presentation Error. ——格式错。程序没按规定的格式输出答案。(PE)
    f、Memory Limit Exceeded. ——超内存。程序没在规定空间内出答案。(MLE)
    g、Compile Error. ——编译错。程序编译不过。(CE)

  5. 团体程序设计天梯赛。
    团体程序设计天梯赛是中国高校计算机大赛的竞赛版块之一,赛旨在提升学生计算机问题求解水平,增强学生程序设计能力,培养团队合作精神,提高大学生的综合素质,同时丰富校园学术气氛,促进校际交流,提高全国高校的程序设计教学水平。比赛重点考查参赛队伍的基础程序设计能力、数据结构与算法应用能力,并通过团体成绩体现高校在程序设计教学方面的整体水平。竞赛题目均为在线编程题,由搭建在网易服务器上的PAT在线裁判系统自动评判。难度分3个梯级:基础级、进阶级、登顶级。以个人独立竞技、团体计分的方式进行排名。

程序设计涉及知识点

初期:

一.基本算法:

  1. 枚举.
  2. 贪心.
  3. 递归和分治法.
  4. 递推.
  5. 构造法.
  6. 模拟法.

二.图算法:

  1. 图的深度优先遍历和广度优先遍历.
  2. 最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
  3. 最小生成树算法(prim,kruskal)
  4. 拓扑排序
  5. 二分图的最大匹配 (匈牙利算法)
  6. 最大流的增广路算法(KM算法).

三.数据结构.

  1. 排序(快排、归并排(与逆序数有关)、堆排)
  2. 简单并查集的应用.
  3. 哈希表和二分查找等高效查找法(数的Hash,串的Hash)
  4. 哈夫曼树
  5. trie树(静态建树、动态建树)

四.简单搜索

  1. 深度优先搜索
  2. 广度优先搜索
  3. 简单搜索技巧和剪枝

五.动态规划

  1. 背包问题.
  2. 型如下表的简单DP
  3. E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列)
  4. C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)

六.数学部分

组合数学:

  1. 加法原理和乘法原理.
  2. 排列组合.
  3. 递推关系.

数论:

  1. 素数与整除问题.
  2. 进制位.
  3. 同余模运算.

中级

一.基本算法

  1. C++的标准模版库的应用.
  2. 较为复杂的模拟题的训练

二.图算法

  1. 差分约束系统的建立和求解.
  2. 最小费用最大流
  3. 双连通分量
  4. 强连通分支及其缩点.
  5. 图的割边和割点
  6. 最小割模型、网络流规约

三.数据结构

  1. 线段树.
  2. 静态二叉检索树.
  3. 树状树组
  4. RMQ.
  5. 并查集的高级应用.
  6. KMP算法.

四.搜索

  1. 最优化剪枝和可行性剪枝
  2. 搜索的技巧和优化
  3. 记忆化搜索

五.动态规划

  1. 较为复杂的动态规划(如动态规划解特别的施行商问题等)
  2. 记录状态的动态规划.
  3. 树型动态规划

高级

一.图算法

  1. 度限制最小生成树和第K最短路.
  2. 最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解)
  3. 最优比率生成树.
  4. 最小树形图.
  5. 次小生成树.
  6. 无向图、有向图的最小环.

二.数据结构.

  1. trie图的建立和应用.
  2. LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和 在线算法(RMQ+dfs)).
  3. 双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的目的).
  4. 左偏树(可合并堆).
  5. 后缀树(非常有用的数据结构,也是赛区考题的热点).

三.搜索

  1. 较麻烦的搜索题目训练
    (poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
  2. 广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜
  3. 深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索.

四.动态规划

  1. 需要用数据结构优化的动态规划.
  2. 四边形不等式理论.
  3. 较难的状态DP.

五.综合题.

  1. poj3109
  2. poj1478
  3. poj1462
  4. poj2729
  5. poj2048
  6. poj3336
  7. poj3315
  8. poj2148
  9. poj1263

参加程序设计训练心得

  • 回想当初参加程序竞赛时,懵懵懂懂。学院老师安排我们每天都要进行训练,不过没给我们安排具体的训练任务,只是让我们自己在OJ上刷题,盲目的刷题提升效率是有限的,不过一味地研究算法也是没有用的。我们刚开始训练的时候,是自己百度初级的算法,然后每天学一个算法,每天晚上不同小组的分享自己学习的算法,不过这种方式不推荐。
  • 个人建议学弟学妹自己事先查一查初期需要掌握的算法和中期需要掌握的算法,然后自己定一个两个月的计划,用两个月的时间来将初期和中期的算法都过一遍,具体分配到每天要学习什么算法,在这个过程中如果某天没能完成当天的学习任务,将耽搁那天的学习任务暂时放在一边,继续按照既定计划进行训练,因为各算法之间没有很强的关联性。
  • 根据自己的课程适当的安排自己的学习计划,在课程多的日子里可以少安排一些学习计划,但是不管怎样每天都要保持编程学习,因为只有每天都进行编程学习才能让你保持灵活的思考。
  • 以下是一个学习计划表,供各学弟学妹参考。
  • 浅谈大学参加程序竞赛_第1张图片

训练心态问题

  • 编程学习、训练不像唱歌跳舞弹琴,是非常枯燥的。而且这个学习时间是你的课余时间,有时会因为你在学习、训练,但是你的室友同学跑出去旅游去了,去约会了,这可能会让你很羡慕,对于这种情况只能自己给自己喂鸡汤了。作为过来人,我只想说一句:每个人都有自己的人生,只要你把当下的事情踏踏实实的做好了,你的人生就没有遗憾,别人过着的生活你可能目前相隔甚远,但是要相信你过着的生活亦是别人羡慕着的。
  • 当然光有鸡汤是不行的,编程训练时可能一坐就是3-4个小时,坐到自己脖子痛。所以还是要劳逸结合是最好的,所以建议一个团队的三个人在一起训练,买个三国杀之类的桌牌游戏或者羽毛球牌放在训练的地方,定下学习时间,学习3小时就去活动一下,可别把身体坐出毛病来就不好了!

组队建议

  • 由于ACM大学生程序设计竞赛是三人为一个团队进行参赛,所以在省级程序竞赛一般就会按照这个要求来进行比赛,那么组队时选择合适的队友是一个很重要的事情,不一定和能力强的人组队就能拿到很好的成绩。
  • 一个三个人的团队,竞赛时只有一台电脑进行操作。所以没有必要聚集三个操作能力很强的人在一个团队。在组队时建议首先考虑相互之间的性格问题,人在一起叫做聚会,心在一起才叫团队,三人之间应该能相互听取建议和想法。其次在能力上,建议其中一个人的英语能力尽可能的好(在进行ACM预选赛时题目是全英文的),一个人的思维能力活跃(能快速的找到题目的切入点进行模型转换),一个人将伪代码转换为C源码的能力强(可以将队友提供的伪代码快速转换为源码)的进行组队。

如何平衡训练和其他课程学习

  • 要参加编程竞赛,训练肯定是在课余时间,大学一个学期课还是蛮多的,尤其是有些专业课还不是只靠期末几天就能搞定的。但其实只要认真听课,其实作业和期末考试都还是比较简单的。所以建议不管上什么课,课上认真听课,摆好作为学生的态度。
  • 说到认真学习,我是感触特别深刻的,回想自己大一、大二、大三,上课都是喜欢的课认真听,不喜欢的课还是会玩手机,走神。大四上学期在实习,没有上课,作为实习去听课的时候反而觉得精精有味,大四下学期刚开学的时候去武汉那边考工作,去武汉理工大学逛了两圈,当时武汉理工大学正在上课中,我去看了两栋教学楼,总共有140多间教室在上课,所有的教室没有看到一个学生不认真听课,都在认真的做笔记。所以回到学校,大四下学期开的课我都非常认真的听课,期末考试时没有复习(我们是停课两周后考试,这两周回家挖土以为自己会忘得差不多了),拿到试卷一个小时做完检查了两遍,分数出来卷面分85分,不高但也不低了。
    ![武汉理工大学上课现场
  • 所以总体来说,摆好自己的态度,上课认真听课,那么才能让你的课余时间真正属于你自己,而不是用不上课的时间来做课程练习。

参加程序设计比赛对自己的作用

  1. 参加程序设计竞赛可以增加你的课外研学分
  2. 参加程序竞赛可以让你认识一些课外的朋友,这种友情可能比同学之情更真实
  3. 参加程序竞赛可以锻炼自己的思维
  4. 参加程序竞赛可以给自己将来找工作提供训练和锻炼
  5. 参加程序竞赛获奖的话可以一举成名,还会有不错的奖励哦
  6. 参加程序竞赛可以到其他地方去看风景,如果是参加ACM亚洲赛区预选赛,学校出路费去比赛,比赛完成可以顺路看看当地的风土人情
  7. 如今这个大数据时代,万物皆被数据化,参加程序竞赛有可能让你将来参与某些大项目。简而言之:不编程就被编程

学院程序设计训练方法和模式的建议

  1. 老师领进门。如果学院能给出在程序设计竞赛中可能要用到的算法,有教程或者提供可学习的资料最好。
  2. 让每一个参加程序设计训练的同学学会用markdown写笔记,然后把自己每天的学习写笔记进行记录,包括学习任务,学习成果,学习时间。收集他们的笔记存档,以供后面的学弟学妹参考。
  3. 适当和参加程序设计的同学交流。及时发现个别犹豫不决的学生,别让其成为害群之马。
  4. 定期进行测试。以检测学习成果,并对训练成效提升快的同学进行奖励。
  5. 学院可以让参加程序竞赛的同学报名计算机二级C语言考试,考过的给报销报名费,让学生能后一举多得,在参加程序竞赛的同时还能拿到技能认证,打消同学们参加比赛没能参与技能认证考试的忧虑。
  6. 在同学训练过程中,老师巡视时可以拍摄一些照片,每年学院的颁奖典礼上可以将其制作成电子相册进行播放。让参赛的同学有成就感,也能展示数据学院的风采。

学习平台推荐

  1. C语言网
    这里面有丰富的学习视频和大量的题可以进行练习。

  2. 实验楼
    这里面有很多使用的案例,通过这些案例能提升自己对编程的理解。

你可能感兴趣的:(Noi竞赛相关)