ACM ICPC(A ssociation对于C omputing中号achinery –我国际电信联盟çollegiate P AGC软件Çontest)是一个全球性的年度多层次的编程大赛正在组织了超过13年。比赛由IBM赞助。
本文重点讨论对竞争性编程重要的所有主题,尤其应该研究哪些主题,以便为即将到来的ACM-ICPC竞赛训练自己。
竞赛规则-2017年世界决赛规则请点击此处
印度参与者– Codechef负责所有印度地区的活动。单击此处了解团队组成,报销等信息
CodeChef编写的ICPC for Schools –该竞赛是学生与印度各地举行的ICPC大学参加者一起参加ACM ICPC竞赛的门户。这是CodeChef构思并得到Amrita大学支持的想法。
ICPC问题样本:常见的ICPC问题具有以下特征:
- 问题陈述:描述问题以及要生成的输出。
- 输入:请确保您已仔细阅读本节,因为遗漏任何次要细节可能会使您陷入错误的答案区域。
- 输出:就像上面一样,这一点也应该仔细阅读。
- 约束:这些约束可以包括对输入,时间,内存,代码大小等的约束。
- 时间限制:查看您的算法是否可以在此范围内工作。如果没有,那就该改变了!
- 内存限制:如果您喜欢为每件小事分配内存,那么现在是更改内存的好时机。
准备ACM-ICPC
首要步骤:实践–以下是在实践ACM-ICPC竞赛和问题时可以参考的资源。对于所有这些OJ,首先要解决提交量最大的问题,然后检查其他解决方案以检查您可以如何改进。参加他们的每月竞赛以保持最高水平。
- ACM-ICPC过去的问题– ICPC存档,Codechef的实践
- TopCoder –通过逐步增加问题级别来进行
- Codeforce-问题集列表
- Codechef –初学者可以从Codechef初学者开始,并进一步进行
- SPOJ –从容易的问题转变为棘手的问题
- USACO –优秀的培训资源
- uvaOnline法官–大量问题
- Hackerrank –明智地练习问题并参加预备系列
- Hackerearth –参加预备系列
- 练习–适合初学者。遇到的问题从难度级别学校到困难。
- 全年在线提供各种竞争性编程竞赛的列表
要学习什么?
对于ACM ICPC的追求者而言,仅了解编程的基本知识将无法取得丰硕的成果。人们还需要对所使用的高级算法有透彻的了解。后续主题列出了必定必须知道的必要主题和算法,以提高并在实际竞争中有机会。
基本数据结构:要开始竞争性编程,必须掌握数据结构。以下是最常用的数据结构列表:
- 大批
- 堆
- 队列
- 细绳
- 堆
- 杂凑
- 广泛的数据结构清单
先进的数据结构
优先级队列,联合查找集,(增强的)间隔树,(增强的)平衡BST和二进制索引树
- 二叉索引树或Fenwick树
- 段树(RMQ,范围总和和延迟传播)
- KD树(请参阅插入,最小值和删除)
- 联合查找不相交集(循环检测以及按等级和路径压缩)
- 尝试
- 间隔树
更高级的数据结构。
排序和搜索:集中精力学习基本概念,并熟悉所有可用的库函数。
- 二元搜寻
- 快速排序
- 合并排序
- 订单统计
字符串操作:字符串也会使编程问题变得有趣且困难,这可能就是在此类比赛中广泛使用它们的原因。实际上,学习String的库函数非常有帮助(C++:请参见Java的String)。
- KMP算法
- 拉宾·卡尔普
- Z的算法
- Aho Corasick字符串匹配
选择正确的语言:到目前为止,在编程竞赛中,C++是最受欢迎的语言,其次是Java ,但是您应该始终选择自己喜欢的语言。对任何一种语言保持自信是最重要的。
标准模板库:一个典型的库,特别是对于那些使用C++作为编码语言的库
- 通过Topcoder上电C++ STL –第1部分,第2部分
- C++魔术师– STL算法
动态编程
- 最长公共子序列
- 最长递增子序列
- 编辑距离
- 最小分区
- 覆盖距离的方法
- 矩阵中的最长路径
- 子集总和问题
- 游戏的最佳策略
- 0-1背包问题
- 装配线调度
- 最佳二叉搜索树
所有DP算法
回溯
- 迷宫中的老鼠
- N皇后问题
- 子集总和
- m着色问题
- 哈密顿环
有关回溯的更多文章
贪婪算法
- 活动选择问题
- Kruskal的最小生成树算法
- 霍夫曼编码
- 排序输入的有效霍夫曼编码
- Prim的最小生成树算法
有关贪婪算法的更多文章
图算法:如果准备ACM – ICPC,则是不可忽视的最重要主题之一。
- 广度优先搜索(BFS)
- 深度优先搜索(DFS)
- 从源到所有顶点的最短路径** Dijkstra **
- 每个顶点到另一个顶点的最短路径**弗洛伊德·沃舍尔**
- 最小生成树** Prim **
- 最小生成树** Kruskal **
- 拓扑排序
- 约翰逊算法
- 图形中的关节点(或切点)
- 图中的桥梁
所有图算法
基础数学
算术:程序员必须知道如何在内部表示整数和实数,并且应该能够对高精度数字进行编码。位操作技巧和了解数字基本算术的库函数将非常有帮助。
数论:了解其中一些概念可以节省比赛中的编程时间和精力。
- 模幂
- 模乘逆
- 原始性测试|套装2(Fermat方法)
- 欧拉的Totient函数
- Eratosthenes筛
- 凸包
- 基本和扩展的欧几里得算法
- 分段筛
- 中国余数定理
- 卢卡斯定理
组合法:虽然直接接缝可能并不重要,但是组合法对于估计算法的渐进复杂性很重要。
- 算法分析
- 组合博弈论|设置1(简介)
几何算法
- 凸包
- 格雷厄姆·斯堪
- 线相交
- 矩阵求幂与此
- 在线构建3-D凸包
- Bentley Ottmann算法列出n个线段的所有交点
- 旋转卡尺技术
- 矩形结合的面积/周长
- 最接近的一对
- 圆环联盟地区
- Delaunay三角剖分的n点
- 使用财富算法的n点Voronoi图
- 指出多边形问题
网络流算法
- Maxflow Ford Furkerson Algo和Edmond Karp的实施
- 最小切
- 稳定的婚姻问题
- Dinic最大流量算法和Wiki
- 最低成本流问题
- 连续最短路径算法
- 循环取消算法
- 最大加权二分匹配(Kuhn Munkres算法/匈牙利方法)
- 匈牙利算法Wiki
- 分配问题的匈牙利算法
- 最大二分匹配
- Stoer Wagner最小割算法
- 一般图中的最大匹配(开花收缩)
- 果树-胡树
- 中文邮递员问题(也请参阅此)
- 用于最大匹配的Hopcroft–Karp算法
关于几何算法的所有文章
更高级的东西
位算法,随机算法,分支定界,数学算法,重光分解,A *搜索
您可能想阅读的内容丰富的文章
- 竞争编程的绝妙清单– Codeforces
- 解决比赛中所有C++问题所需的算法是什么? – Quora
- 准备ACM-ICPC的最佳书籍和网站– Quora
- 编程竞赛简介– Stanford.edu
- ACM-ICPC的世界最终问题– icpc.kattis
参考:
编程营课程提纲
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。