📜  进行竞争性编程时要关注的要点

📅  最后修改于: 2021-09-17 07:46:45             🧑  作者: Mango

竞争性编程对于一个人在编码领域的发展至关重要。本文将讨论一些在比赛时应牢记的基本要点。

  • 列出执行问题中经常遇到的任务的函数列表,并以模板的形式将它们添加到您的代码中。这可以节省比赛期间的时间,并有助于快速提交解决方案。需要在模板中添加的一些有价值的功能如下:
    • 幂函数( a N %M ,其中 a, b, N 是整数,M 是素数)
    • 印刷主要因素
    • 打印质数
    • 使用 mod 查找 nCr 的函数
    • 计算 GCD 的函数。
  • 在思考解决问题的方法的同时关注约束。根据约束条件,通过计算方法的时间复杂度来检查设计的解决方案是否可以通过所有测试用例。
  • 仅当约束足够小(例如2 N )且不会超过时间限制时才考虑位掩码或蛮力。因此,该方法应包括检查所有可能的结果组合。
  • 如果存在涉及输入形式的排序数据的问题,请考虑使用二分搜索的方法。
  • 如果有与树、图(循环检测等)相关的问题,请培养一种思维方式,思考围绕深度优先搜索或广度优先搜索的方法,这是解决此类问题的基本要求。
  • 数论
    • 两个或多个奇素数相加总是偶数(例如13 + 3 = 16, 19 + 5 = 24)。
    • 哥德巴赫猜想是数学中著名的未解决问题之一(更准确地说是数论)。注意:对于更大的数字,它没有得到证明。
    • 数论中还有其他几个概念需要掌握才能在 CP 中取得好成绩。
  • 如果一个状态依赖于未来状态,那么用贪心解来解决问题是不可能的。此外,不能采用幼稚的方法,因为它会超过时间限制。因此,对于所有此类问题,始终尝试使用动态规划解决方案来解决。
    如果可以编写一个以指数复杂度工作的简单递归解决方案,那就非常简单了。将访问过的每条路径存储在内存中,以后可以使用这些路径来寻找解决方案,这称为记忆化。一旦学会了记忆法,逐渐学会了制表法。
  • 如果存在与XORORAND等位运算符相关的问题那么它可以通过这些操作更改数组,有时天真的方法会起作用,因为最多有 64 个具有不同 MSB (2 64 ) 的数字。但在这种方法中,主要任务是确定基本情况。
    让我们举一个例子,其中给出了一个按递增顺序排序的数组,任务是通过用两个最小次数的按位异或替换两个相邻元素来使其不递增。

    方法:这也可以用朴素的方式解决,即找到一个子数组,其异或小于子数组起始点之前的元素或小于子数组结束点之后的元素。

    但是,在此之前处理基本情况,即如果存在 3 个连续元素且 MSB 相同(例如arr[i – 1] = arr[i] = arr[i + 1] 的MSB),则获得结果用arr[i] ⊕ arr[i + 1]替换它。

    因此,对于数组中的朴素方法,仅当N > 60 时,因为2*(⌊log 2 10 9 ⌋ + 1) = 60 。 (让, a[i] <= 10 9 )。乘以 2,因为这是唯一可能的最后一种情况。如果乘以 3,那么肯定会有3 个具有相同 MSB(最高有效位)的连续元素

  • 数组元素的 GCD 也可以表示为:

    证明:

  • 一些最常用的按位运算符属性可以是:
    • a ⊕ b = a | b – a & b
    • a + b = a ⊕ b + 2*(a & b)
    • a + b = a | b + a & b

    这里’a’和’b’是整数,⊕表示XOR,&表示AND和|是指或。