📜  进行竞争性编程的一种更好的方法

📅  最后修改于: 2021-06-26 15:41:28             🧑  作者: Mango

本文为所有想开始竞争性编程的人提供了帮助。唯一的先决条件是对编程语言的了解。

现在,让我们找到一种更好的竞争性编程方法。请注意:

  1. 人们应该阅读正确的输入和输出格式,因为大多数初学者会在输出中包含多余的打印语句时出错。因此,请注意输出格式。示例–“请输入下一个数字:”和“输出为:”。
  2. 在编写代码之前,请分析问题约束,因为大多数情况下,您编写的代码都是蛮力的,并且不会在给定的时限约束下运行。

以下是初学者可能遇到的一些问题。

  1. 时间限制:以秒为单位。它使您可以洞悉正确解决方案的顺序。请考虑以下情况:时间限制= 1秒
    让我们假设大约1秒可以执行10 ^ 8的操作。
    如果您编写的程序的顺序为O(N ^ 2),并且该问题有T个测试用例。然后,您的程序的总顺序将变为O(T * N ^ 2)。
    如果T <= 1000且N <= 1000,则(忽略渐进表示法中的隐藏常数)在最坏的情况下可能不会接受您的代码,因为1000 * 1000 * 1000是10 ^ 9运算,意味着10秒。
    为避免使用TLE,请始终考虑可能导致该问题的最坏测试案例,并在这种情况下分析您的代码。
  2. 运行时错误:这是初学者最常遇到的问题之一。主要原因可能是:
    1. 分段错误:这是非法访问内存地址。
      例如, int [] array = new int [100]; System.out.println(array [101]);
    2. 声明大于10 ^ 8的数组。
    3. 除以零取模。
    4. 您应该知道如何使用GDB,它将帮助您纠正运行时错误。
  3. 编译错误:这是使用C / C++编程时经常遇到的错误之一。
  4. 错误答案:每当您遇到WA时,请编写蛮力代码并确保它是完美的。现在使用C++中的随机函数生成测试用例。在这些测试用例上运行代码,并匹配输出。现在考虑可以帮助您在算法中找到问题的极端情况。

  5. IntOverflow :很多时候,您不知不觉中会超过可以存储在基本类型int中的最大值。例如约束:0
    #include
    int main()
    {
        int num1, num2;
        cin >> num1 >> num2;
        int answer = num1 + num2;
      
        // error if num1 and num2 are large
        // numbers
        cout<< answer; 
      
        return 0;
    }
    

上面的程序不能总是正确运行,因为(2 * 10 ^ 9)它可能会超过可以存储在INTS中的最大值。即10 ^ 9。因此,在这种情况下,您将必须使用long long int或unsigned int基本数据类型作为答案。

  • 比较双打
    int main()
    {
        float a ;
        cin >> a;
        if (a == 10)
          cout << “YES”;
    }
    

    float和double数据类型没有无限的精度。当心(它们分别为6/15位精度)。因此在比较时始终使用(〜0.0000001)的余量。例子 –

    if (abs(a -10) < (0.0000001))
    {
        cout << “YES”;
    }
    
  • 其他有用的要点:
    有时,当您被卡住时。检查其他可接受代码的运行时间,并分析所需的解决方案顺序和允许的内存量。

    1. 4 MB〜大小为10 ^ 6的整数数组(假设int占用4个字节)或大小为10 ^ 3 * 10 ^ 3的二维数组

    在大多数问题中,标准内存限制约为256MB。

    如果必须分配一个大数组,那么在函数内部进行分配不是一个好主意,因为将为每个测试用例分配和释放内存,并且在函数调用堆栈上分配内存(在许多地方堆栈大小受到限制) )。因此,如果必须制作大型数组,请将其设为全局。

    希望本文对您有所帮助,并希望您现在能够尝试更好地准备问题,从而更快,更好地执行问题。 🙂

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