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

📅  最后修改于: 2021-04-17 18:22:34             🧑  作者: 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 ) 。但是在这种方法中,主要任务是识别基本情况。
    让我们来看一个示例,其中给出了一个按升序排列的排序数组,任务是通过用两个最小次数的按位XOR替换两个相邻元素来使其不递增。

    方法:这也可以以幼稚的方式解决,即找到一个XOR小于子数组起点之前的元素或小于子数组终点之后的元素的子数组。

    但是,在该句柄处理之前,如果存在3个连续元素且MSB相同(例如arr [i – 1]的MSB = arr [i] = arr [i + 1] ),则可以得到结果通过将其替换为arr [i]⊕arr [i + 1]

    因此,对于在阵列幼稚的方法,只有当N> 60,因为2 *(2⌊log10 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和|表示“或”。