为什么信奥赛学霸做题那么快?不是智商高,而是他们的大脑里,存放的方法更多!
很多孩子都会有这样的疑问:
"为什么别人三分钟就想到做法,我看了二十分钟一点思路都没有?"
有的孩子开始怀疑:
"是不是他们比我聪明?"
"是不是我天生不适合学算法?"
其实,大多数情况下,
真正拉开差距的,从来不是智商,而是——大脑里储存的方法。
一、大脑,其实像一个C++仓库
1、想象一下。
有两个小程序员来到"算法超市"。
老师出了一道题:
给你100万个数字,快速找出最大的那个。
2、第一位同学
他开始想:
"要不要排序?"
"排序以后最大的就在最后……"
于是他开始写:
sort(a + 1, a + n + 1); cout << a[n];3、第二位同学
他的大脑里存着另外一个方法:
打擂台,求最大值
于是直接写:
int ans = a[1]; for(int i = 2; i <= n; i++) { ans = max(ans, a[i]); } cout << ans;4、你觉得,
那个孩子更聪明吗?
相必大家都会认为,
他们都有自己的方法,都很聪明。
二、参加信奥赛,厉害的人,不是在考试现场发明方法
1、很多家长都有一种误解:
学霸是不是,考试现场就能发明出来解题方法?
2、其实不是。
医生为什么看病快?
因为:
看到发烧。
马上想到:
病毒?
细菌?
炎症?
肺炎?
他们不是现场创造医学。
而是:
从记忆里快速调用知识。
3、信奥赛也是一样。
看到一道题。
高手脑子里开始自动匹配:
这个像枚举。
这个像DFS。
这个像前缀和。
这个像二分答案。
这个像动态规划。
这叫:
模式识别(Pattern Recognition)
而不是:
临场创造。
三、举个真正的信奥赛例子
来看一道经典题。
1、题目
给你一个长度100000的数组。
多次询问:
第L到R个数字的和是多少?2、有的同学第一反应:
每次都循环。
int sum = 0; for(int i=L;i<=R;i++) sum += a[i];3、可是,如果询问100000次。
时间复杂度:
O(n × q)一定超时。
4、如果是学过前缀和的孩子。
(1)看到题目。
脑子立刻亮灯。
区间和!
前缀和!
(2)然后直接写:
pre[i] = pre[i-1] + a[i];查询:
cout << pre[R] - pre[L-1];结束。
(3)为什么?
因为他的脑海里已经存着:
区间求和 = 前缀和。
这不是智商高。
而是方法库存。
四、再来看一道DFS
1、题目:
求一个迷宫是否能走到终点。
2、没学过DFS的孩子:
开始一格一格想。
向上?
向下?
向左?
向右?
越想越乱。
3、而学过DFS的人。
(1)脑海自动浮现:
进入房间 ↓ 标记访问 ↓ 四个方向继续走 ↓ 返回(2)于是直接写:
void dfs(int x,int y) { vis[x][y]=1; for(int i=0;i<4;i++) { int nx=x+dx[i]; int ny=y+dy[i]; if(...) dfs(nx,ny); } }(3)有的同学觉得:
"他怎么一下就写出来了?"
其实,
他不是现场想到。
而是:
平时已经写过几十遍,上百遍了。
五、为什么汉克老师总让大家去刷经典题?
1、有的孩子会说:
"老师,这题我做过了。"
"为什么还要做?"
2、原因很简单。
因为:
第一次做。
只是认识。
第二次做。
开始理解。
第三次做。
开始熟练。
第五次做。
不用思考。
第十次做。
形成条件反射。
这时候。
看到题目。
方法已经自己跳出来了。
六、真正的学霸,大脑像一个算法工具箱
1、普通同学:
只有一把锤子。
看到什么都想敲。
2、而高手的大脑里。
放着很多工具。
数组 字符串 排序 枚举 模拟 双指针 二分 前缀和 差分 DFS BFS 递归 贪心 哈希 动态规划 树 图论3、遇见一道题。
不是重新发明工具。
而是:
拿出来。
使用。
放回去。
所以速度越来越快。
七、为什么同样学习一年,有人越学越快?
1、有的人认为:
速度来自天赋。
2、其实更多来自:
知识之间开始连接。
3、例如:
开始学习了:
数组后来学习:
前缀和再后来:
二维前缀和后来:
差分后来:
树状数组4、你会发现:
它们越来越像。
新的知识。
不是重新学习。
而是在旧知识上升级。
5、所以:
高手学习越来越快。
因为:
方法网络已经建立起来了。
八、真正需要积累的,不是题,而是方法
1、有的同学每天刷五十题。
半年以后。
一道没见过的新题。
还是不会。
为什么?
2、因为:
他记住的是:
这一题。
而不是:
这一类。
3、真正厉害的人。
每做一道题。
都会问自己三个问题:
① 这道题属于哪一种算法?
② 为什么这种算法适合?
③ 下一次看到什么特征,我应该想到它?
这三句话。
比多刷十道题更重要。
九、学习信奥赛,其实是在建立自己的"算法图书馆"
1、每学会一个算法。
就像买来一本新书。
放进图书馆。
2、开始。
里面只有:
数组后来有:
排序后来:
二分后来:
DFS后来:
动态规划再后来:
最短路 并查集 线段树 树形DP3、图书馆越来越大。
遇见问题。
不用重新写书。
只需要:
找到对应那一本。
翻开。
解决。
十、送给每一位正在努力学习C++编程的同学
1、如果今天你做题很慢。
不要着急。
不是因为你不聪明。
只是你的"算法仓库"还没有装满。
2、每学会一个知识点。
就是往仓库里放进一件新的工具。
每完成一道经典题。
就是让这件工具更加锋利。
每一次总结方法。
都是在给自己的大脑建立索引。
3、总有一天
当你看到一道新题时,不再是"这题我不会",
而是:"这个特征我见过,这应该用前缀和!"
"这个状态很熟悉,应该是动态规划!"
"这个图可以遍历,用 DFS 或 BFS!"
4、那一刻,你会发现:
真正让学霸做题越来越快的,
不是更高的智商,
而是更多的方法、
更清晰的分类,
以及一次又一次刻意练习后
形成的条件反射。
5、请相信:
算法能力,不是天赋的礼物,而是方法积累后的自然结果。
今天多储存一种方法,明天就会少走很多弯路。
坚持学习,坚持总结,坚持思考。
你的"算法图书馆",终将成为别人眼中的"天赋"。