[DMY]2024 NOIP 模拟赛 Day 9
比赛的经历让我对一些思路的选择和时间管理有了更深的反思。以下是我对比赛过程的详细回顾和分析。
赛时
T1: 双指针误区与暴力解法
比赛一开始,我对 T1 题目做了一个快速的判断,误以为它是一个双指针问题。看到题目中有两个线段或区间的概念,我立即联想到了双指针方法,尝试按照这个思路来解题。然而,在解的过程中,我发现自己的假设并不成立,题目似乎并不是单纯的双指针问题。这时,我开始放弃双指针的做法,转而选择了暴力的方法。
我设计了一个 n^2 的暴力解法来穷举所有可能,虽然它的时间复杂度较高,但至少能保证正确性。此时虽然暂时解决了问题,但暴力方法明显不是最优的,无法通过时间限制。这也让我意识到,如果能有更多的时间进行深入思考,可能会发现更加高效的解决方案。因此,我决定放弃继续优化这个题目,转向其他题目。
T2: DP 与图算法的交叉
T2 题目看起来像是一个典型的动态规划问题,涉及到某种组合数的求解。初步分析时,我尝试写了一个暴力的组合数求解方法,但显然这个方法的时间复杂度过高,导致无法在限定时间内解决问题。于是我开始寻找是否有更高效的算法,可以减小计算复杂度。
在这个过程中,我想到可以通过图算法来优化。于是我尝试了使用 Dijkstra 算法,每次用 n 遍 Dijkstra 来计算最短路径。然而,经过一段时间的调试,我意识到 Dijkstra 并不是最合适的选择,Floyd 算法或许能更好地处理这个问题。虽然 Floyd 算法的时间复杂度是 O(n^3) 的,但它对于某些小规模图而言可能会更加直接高效。修改思路后,我逐步完成了代码。接着,我开始处理
k=1 的子问题。这个部分显然可以用暴力枚举和模拟来解决。我通过模拟了几种情况,终于解决了
k=1 的问题。但当我检查代码时,发现下标混用了,导致结果不准确。花了一些时间纠正了错误,最终通过了。然而,当我尝试解决
k=2 时,情况就复杂了。我花了大约 40 分钟试图找出一个有效的解决思路,但一直没有突破。这段时间让我意识到,遇到这种无法立即想通的问题时,应该及时调整心态,尝试回顾题目本身,或者考虑从不同的角度入手。有时我们过于固守原先的思路,反而容易陷入死胡同。
T3: 完全没有思路
面对 T3,我完全没有任何思路。题目的描述让我感到很陌生,无法立刻从中找出解题的关键点。由于时间紧迫,我没有选择在这道题上浪费过多时间,而是决定继续完成其他题目。也许是因为题目难度较高,我的思路无法马上理清楚,所以我决定放弃,避免浪费时间。
T4: 贪心与桶维护
对于 T4,起初我也以为它是一个典型的 DP 问题,并试图用 n^2 的动态规划方案来求解。然而,当我深入分析时,发现问题的性质更适合用贪心算法来处理,特别是结合桶的维护,可以有效降低复杂度。
在进一步的思考中,我发现可以通过贪心算法来逐步构造解,并使用桶来记录和维护状态,从而优化求解过程。最终,我成功实现了这一思路,解决了这个问题。
反思 T1 和 T4 的优化
在比赛过程中,我多次尝试回到 T1,进行一些随机化的尝试,希望能够从概率的角度找到解法。然而,虽然这个思路有一定的吸引力,但最终并没有取得实际进展。这让我意识到,算法题并不是所有情况下都适合使用随机化方法,有时直接通过数论或组合数学的思路来求解会更加高效。因此,在遇到复杂问题时,应该更加注重题目本身的结构,而不是盲目依赖一些新颖的技巧。
对于 T4,尽管我在赛后看到 PSM(Problem Setter's Manual)提到卡常算法可以通过 n,m≤50000 的情况,但我在赛中始终卡不过。这让我反思是否遗漏了某些细节,或者我的实现有改进空间。毕竟,卡常优化是针对大规模数据的典型技巧,但它的具体实现需要非常精准,可能涉及到更细致的内存管理和数据结构设计。
赛后总结与改进
赛后,我对 T2 中的 k=1 做了进一步的分析,发现原本可以直接通过暴力法来求解,并且没有必要过早地切换到复杂的图算法上。T2 的问题让我意识到,有时我们过于依赖于某些熟悉的算法,但其实暴力解法有时可以给我们带来意外的收获。简单的暴力解法不仅能减少复杂度,而且还能够帮助我们更快地发现问题的本质。
对于 T4,尽管我没能完全解决,但也通过一些思考总结了优化方法。PSM 提到的卡常算法实际上是一个非常重要的优化方向,在比赛时由于时间有限,我没有足够深入地去理解和应用这一方法。未来如果再次遇到类似的问题,我会提前学习和掌握卡常的技巧,尤其是如何在比赛中高效地应用它。
这次比赛经历让我更加清楚地认识到,在时间紧迫的比赛中,如何快速分析题目的类型并做出合适的决策是非常重要的。面对未能解决的问题,我应该学会放弃,而不是一味纠结。同时,要善于从错误中总结经验,并在赛后进行反思和提升。