📜  竞争性编程:克服给定的问题

📅  最后修改于: 2021-06-26 22:56:54             🧑  作者: Mango

编程是开发和实现一组指令以使计算机能够执行特定任务的过程.ACM ICPC,Google CodeJam和IEEE Extreme等编程竞赛是探索程序员智能的令人兴奋的游乐场。
从最初了解比赛到进入ACM ICPC Amritapuri地区办事处,我学到了很多东西,并希望为编码人员分享一些技巧,以解决比赛问题。

在实时竞赛中,由三名学生和一台计算机组成的团队将在5小时内尽可能解决所有给定的问题。解决问题最多的团队将获胜,其中“解决”意味着为一组测试输入(简单和秘密)产生正确的输出。尽管团队成员的个人技能很重要,但要成为一支顶级团队,就必须在团队内部发挥协同作用。

但是,要充分利用策略,尽可能地磨练您的个人技能也很重要。您不必成为天才,因为练习可以使您走得更远。就感觉而言,成为一个好的编程团队有三个关键因素:

  1. 具备标准算法的知识,并能够针对集合中的每个问题找到合适的算法
  2. 能够将算法编码到工作程序中
  3. 与队友制定合作策略

什么是算法?

算法是计算机遵循的逐步说明。

为了能够在编程竞赛中取得竞争优势,您需要了解很多众所周知的算法,并具有识别哪些算法适合特定问题(如果问题很简单)或算法的哪些组合或变体的能力(如果问题有点复杂)。

快速识别问题类型的能力

在所有编程竞赛中,只有三种类型的问题:

  1. 我以前没看过
  2. 我以前见过这种类型,但尚未解决或无法解决。
  3. 我以前已经解决过这种类型。

在编程竞赛中,您将要解决一系列问题,而不是单个问题。快速识别出上述上下文分类中的问题的能力(未见,已见,已解决)将是在编程竞赛中表现出色的关键因素之一。就我的知识和资料库而言,问题通常分为以下类别:

  1. 数学:素数,大整数,置换,数论,阶乘,斐波那契,数列,模量
  2. 动态编程:最长公共子序列,最长子序列,编辑距离,0/1背包,硬币更改,矩阵链乘法,最大间隔总和
  3. 图遍历:洪水填充,弗洛伊德·沃沙尔,MST,最大二分匹配,网络流,铰接点
  4. 排序:气泡排序,快速排序,合并排序,选择排序,基数排序,存储桶排序
  5. 搜索:完全搜索,蛮力搜索,二进制搜索
  6. 字符串处理:字符串匹配,模式匹配
  7. AdHoc问题:琐碎的问题

能够分析您的算法

您已确定问题所在。您认为您知道如何解决它。您现在必须提出的问题很简单:给定最大输入界限(通常在问题描述中给出),我的算法可以以我可以计算的复杂度通过编程竞赛中给出的时限。

通常,有多种方法可以解决问题。但是,其中一些可能不正确,而某些速度不够快。但是,经验法则是:头脑风暴许多可能的算法–然后选择最有效的算法!

记住以下顺序对于快速确定哪种算法在渐近性能上更好是很有用的:常量

编码问题

遵循KISS原则:保持简单和智能,保持所有版本正常工作并逐步完善代码。

在使用最佳算法进行编码,匹配时间/空间复杂度并满足测试用例后(示例测试用例非常琐碎,因此切勿根据它们来测量代码的正确性,也不要尝试棘手的用例),然后提交解决方案-“ ACCEPTED”
确定一个棘手的测试案例以使对手失望,与解决您的思维在边界条件下更多起作用的问题一样重要。

总结一下,这些是一些关键点:

  1. 阅读所有问题,按顺序选择问题:容易解决(如果每个人都在解决选定的问题,请看看它)
  2. 概述算法,复杂性,条件,数据结构和棘手的细节
  3. 集思广益其他可能的算法(如果有)–然后选择最有效的方法
  4. 进行所有数学运算并选择最佳算法。
  5. 尽快对其进行编码,并且必须正确。
  6. 尝试破坏算法–寻找边界测试用例。

成功解决问题的主要口诀是保持镇定,安排时间并采取策略性措施,休息和实践发挥作用。

保持练习 !!

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。