许多程序员总是争辩说,竞争性编程中的问题总是以 TLE(Time Limit Exceed) 告终。此错误的主要问题是它不会让您知道您的解决方案是否会达到正确的解决方案!
为什么TLE来了?
- 在线裁判限制: TLE 的出现是因为在线裁判有一些限制,即在问题设置者给出的特定时间限制(1 秒)后,它将不允许处理指令。
- 服务器配置:代码所花费的确切时间取决于服务器的速度、服务器的架构、操作系统,当然还取决于算法的复杂性。所以不同的服务器如practice、CodeChef、SPOJ等,可能有不同的执行速度。通过估计 N 的最大值(N 是整个代码的指令总数),您可以粗略估计 TLE 会在 1 秒内发生与否。
MAX value of N Time complexity
10^8 O(N) Border case
10^7 O(N) Might be accepted
10^6 O(N) Perfect
10^5 O(N * logN)
10^4 O(N ^ 2)
10^2 O(N ^ 3)
10^9 O(logN) or Sqrt(N)
- 所以在分析这个图表之后,你可以粗略估计你的时间复杂度并使你的代码在上限范围内。
- 读取输入写入输出的方法太慢:有时,程序员用于输入输出的方法可能会导致 TLE。
克服时间限制错误
- 改变输入输出的方法:你必须选择合适的输入输出函数和数据结构来帮助你优化。
- 在 C++ 中,不要使用 cin/cout——而是使用 scanf 和 printf。
- 在Java,不要使用 Scanner——而是使用 BufferedReader。
- 循环边界可能会减少:在编写程序之前仔细阅读输入中的边界,并尝试找出哪些输入会导致程序运行缓慢。例如,如果一个问题告诉你 N <= 100000 或 N<=1000000,并且你的程序有嵌套循环,每个循环都达到 N,你的程序永远不会足够快。
- 优化您的算法:如果这一切都不起作用,那么您应该尝试更改算法或用于解决问题的方法。通常,内部测试用例的设计方式是,只有选择最佳算法,您才能清除所有测试用例。
- 寻找给出的建议:虽然这应该是最后一步,但您必须查看下面给出的注释,其他程序员可能已经暗示如何更好、更有效地解决问题的任何问题都被暗示了。即使您克服了 TLE,请尝试针对您的程序进行更详尽的测试用例来检查性能。
最终,随着经验的积累,您一定会知道该做什么以及不该做什么来避免 TLE。您编写的代码越多,您就越了解如何竞争 TLE。
立即练习