小赖子的英国生活和资讯

竞技编程的边际效应(Marginal Effect)递减

阅读 桌面完整版

什么是竞技编程(Competitive Programming)?

竞技编程的英文是 Competitive Programming,是指在限定时间内通过编写程序解决一系列算法问题的比赛形式。比较知名的赛事有 ACM-ICPC、Codeforces、Google Kick Start 等。这类比赛不仅考验选手的算法功底和编程技巧,还需要良好的思维敏捷性和代码调试能力。

比如我二十多年前在高中参加的 ICPC,就是一种典型的竞技编程。当时我们使用的编程语言还是 Turbo Pascal,比赛时间是三个小时,要解决四道题。那时候只要程序能输出正确的结果就行了,根本不太在意代码的实现方式和写得是否优雅。

Turbo Pascal

我家娃在做 LeetCode 的一道算法题时,由于算法不够高效,有两三个测试用例出现了超时。他索性“投机取巧”地加了一个 if 判断,针对那些特定的输入直接返回正确结果。这样做在 LeetCode 上是可行的——前提是你知道测试数据,并能手动处理特殊情况。

但在实际的比赛中,这种做法往往行不通。一方面你无法提前知道测试输入;另一方面题目设计者也会故意防止这种“硬编码逃课”手法,所以比赛更要求通用、稳健的算法方案。这也是竞技编程和普通刷题平台之间的一个重要区别。

有两个测试用例过不了,就用if来作弊。这在比赛中是不知道输入数据的 test cases

作弊能过力扣,但是在比赛中是过不了的。这算法不够快,有两三个测试用例用时太长。

🏆 ACM-ICPC(国际大学生程序设计竞赛)

⚔️ Codeforces

🚀 Google Kick Start(已停办)

为什么竞技编程的边际效应较低?

在实际工作中,竞技编程中使用的许多技巧和套路并不常用。工程开发更注重系统设计、代码可读性、协作能力以及对业务的理解。而竞技编程更偏向于解谜式的快速编码,在真实项目中的应用场景相对有限。

不过,对于初学者来说,像 LeetCode(力扣)这样的平台就非常友好。相比 Codeforces 或 Google Kick Start 这类比赛,LeetCode 不需要自己处理输入输出,而是直接提供处理好输入的函数,只需要专注于函数逻辑的实现,非常适合用来学习算法和数据结构。

我在教孩子编程时,首选的就是 LeetCode。虽然对那些在 TopCoder 上驰骋的高手来说可能过于简单,但我认为刷 LeetCode 是一个非常好的学习方式。相比 Scratch 这种图形化编程平台,LeetCode 的挑战更实际;而相比直接开发一个完整软件项目,它的学习曲线更平滑。更重要的是,提交通过(AC)后获得的成就感,也能有效激发学习兴趣。

而像 Codeforces 这样的比赛,解题通常需要先仔细阅读题目、理解题意,再思考合适的算法,最后编写并调试代码,整个过程往往非常耗时。

竞技编程的边际效应递减(虽然和力扣一样都能提高Problem-solving的能力):

每天10来分钟 带娃刷力扣,每天进步一点点。

娃在刷题

学编程最好的方法就是把敲/抄代码

带着娃每天刷力扣,有时候他会在iPad上刷。

娃目前坚持171天,刷了105题力扣。看着他进步了。学编程最好的方法就是把代码敲进去。

刷题:程序员的基本技能

刷题是提高编程能力和算法思维的有效方式。

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version