今天分享一篇知乎上一个非常有意思的回答:假如高考考编程会怎样?
2046年的春天,编程全面纳入高考的第四年, 河北某三线城市,星期五下午5点半。
王子明同学拿着手机,一脸沮丧的走在街上,时不时的有电动汽车和外卖机器人在他身边驶过,偶尔天空中划过几架直升机。“都是有钱人,跟我不是一个世界的”。王子明想着,他经过一家充电站,来到杂货店,里面的美女机器人微笑着递给他一瓶可口可乐,还有一块口香糖,他拿起手机在美女的胸前一比划,“总价30元,谢谢光临,欢迎您下次再来。”机器人微笑着走了。“也就喝快乐水能让我稍微快乐一点。“
王子明为什么不高兴呢,因为一模成绩出来了,他的成绩非常不理想,其他科目还好,但是信息技术考砸了,150分的题目只拿到了85分,连及格线都没过。
“高考为什么要考计算机,为什么要考编程,我真羡慕我爸,他们高考根本不考算法!我真想回到10年代,那个时候我早就能上双一流了。“王子明恨恨的说。
王子明的确不擅长编程,Dijkstra,KMP怎么背都背不过,BFS和DFS经常写错边界条件,至于动态规划压轴题,他就从来就没做出来过。他也就只能靠前面那60分选择题拿点分,选择题考的都是计算机基础知识和基本操作,不涉及编程。“现在是高度信息化社会,计算机普及率99%,不会编程的人就是文盲!“ 他脑海里又浮现出计算机老师在课堂上的话。计算机老师是一个又高又瘦的中年妇女,非常严厉,他很怕她,每次走廊里见到她都绕着走。
王子明回到家里,只见家门口站着一个快递机器人,正在给妈妈搬东西,“子明快点,快帮我把这些菜放在冰箱里,肉放冷冻,菜放冷藏。”子明连忙过去帮忙。帮完忙,妈妈问道:“这次一模成绩怎么样,多少名啊?”王子明有点支支吾吾,不愿意说。“20名?”妈妈脸色沉了下来,王子明摇了摇头,“30名?”妈妈脸色更难看了。王子明断断续续说道:“4....2名”
"什么?!42名,你之前不都一直是前20的吗,这次怎么回事?"
“我计算机没考好,只有85分。”
“呵呵!天天都在家里打游戏,我就从来都没看你主动的刷过leetcode ! 你看隔壁那小崔,不仅刷leetcode,每天晚上还要打codeforces,打完还要补题,人家说了,我不把所有题目AC,就不睡觉。你呢,我就从来没见你说过这个话。”
“我刷leetcode,昨天刷了8道呢。”
“别骗我了,你把别人的题解复制粘贴也叫刷题?骗谁呢,自己骗自己有意思吗?高考能让你看别人的题解?你要是真的刷了,好,你现在就给我打开你昨天刷的题,当着我的面给我AC。AC不了,你就别吃饭!“
“妈妈我错了!“王子明快要哭出来了。
妈妈看到王子明这个样子,也有点心软,说道:“孩子,不是我逼你,我也希望你能高高兴兴的去玩耍,你现在还有三个月就要高考了,我们家没钱,你爸爸天天在公司加班拼死拼活一年连100万都挣不了,我们也不能让你去国外读书。你现在这个样子,怎么考好大学?考不上好大学,你就找不到好工作,找不到好工作,就没有女孩子愿意嫁给你。现在中国每3个男人就得有一个在打光棍,你愿意做那三分之一吗?“
“妈妈这些我都知道,但是编程太痛苦了,我讨厌算法,什么dijkstra,什么二分图,什么KMP,现实生活又用不到!“
“妈妈也知道你不喜欢,但是高考它就考啊,妈妈上学的时候也很讨厌数学,也要学一些根本用不到的圆锥曲线方程,三角函数什么的,你咬咬牙,背过它们,高考完就让它们滚一边去不就得了?“
“妈妈我......“
"别说了,要不我给你报个辅导班吧,计算机突击辅导班,周日下午两点去上课。"
“周日我要和小洋去踢球。“
“踢什么球!现在是踢球的时候吗?高考完了你踢到天黑我也不管,现在不行!“
饭后,子明闷闷不乐的回到屋里,打开leetcode,开始完成今天老师布置的题目。说起leetcode,据王子明认识的一个程序员爷爷说,这leetcode在他们年轻的时候就有了,当时的目的是总结一些程序员算法面试的题目。后来因为各大公司都在面试算法,leetcode越做越大,再后来,听闻中国高考要考算法,leetcode立刻推出了中国高考专用版,把总部迁到了北京,迅速统治了中国计算机教育市场,甚至还高价收购了《五年高考,三年模拟》,进军其他学科。目前是全国的中学生都在刷leetcode,老师们也在上面布置作业。
另外,每周的周赛也是全国乃至全球的一场盛会,几十万名用户在上面比赛,小明他们学校有个学长因为某次周赛拿了全球第7,被大家称为“七神”,全校闻名。
......
子明还在刷题,Wrong answer,Wrong answer,数不清的Wrong answer.......好不容易解决了这个wrong answer,又在下一个test case挂了,好不容易把这几个出错的case都解决,结果又变成了Time limit exceeded。“为什么就不能出现Accepted这个词?很难吗?”子明怒吼道。
当子明东拼西凑把最后一道题AC,已经凌晨三点了,他发现桌子旁边有一杯奶,不知道是什么时候妈妈给送过来的。奶旁边还有一张面膜和一个字条,字条写着:“喝完奶早点睡觉,不管你考多少名,你都是妈妈最爱的子明。”
子明躺在床上睡的很香,梦里他变成了一个天才,所有的算法题,只要他随便写点,交上去就通过。不知不觉就到了上午10点,他猛的一下子起来:“糟了,今天还要去补课呢,都迟到两个小时了。”这时候妈妈进来:“孩子不用补了,妈妈已经替你请假了。你昨晚睡的太晚,要好好休息一下。“
“谢谢妈妈!“子明松了一口气。
“你现在就是要全心全力把算法搞好,其他科目都可以放放,我昨天刚给你报了那个计算机辅导班,最后一个名额呢,被我抢到了。辅导班的杨老师非常厉害,而且很擅长一对一辅导。“
“哦!“
“那个辅导班的老师要求你这几天打一场编程比赛,然后把你的比赛记录以及代码发给他,他帮你分析一下。一会10点半是leetcode周赛,你吃完早饭去打一下。能进前1万名我请你吃火锅。“
“好的!“
然而子明并没有进前1万,甚至连前10万都没进,他只做出了一道easy难度的签到题。望着满眼的红色wrong answer,他非常沮丧。有一道BFS的题明明会做,但就是不对,也不知道错在哪里。毕竟,为了提升自己比赛成绩的含金量,防止有人hard code,leetcode平台这几年在比赛的时候不再告诉选手具体哪个test case错了,只会告诉错误类型。
妈妈看在眼里,也没说什么,去卧室给那个辅导老师打电话,“我们家子明可能让您费心了,他在编程方面完全不开窍。”他听到妈妈的声音,电话那边则是 “没问题没问题,这样的学生我见多了,你家孩子算不错的了,起码还做出来一道,没有我教不好的学生。”
周日的下午,他跟妈妈去了辅导班,进了教室,辅导老师正在给大家演示匈牙利算法的实现过程。“我们现在是月老,撮合的越多越好......" 子明听着听着,发现这个老师真的不一般,匈牙利算法讲的栩栩如生,要知道他学校的老师只会念ppt,而且ppt做的还不咋地,但这个老师讲完,他听懂了,而且有种想找一道题练练手的冲动。
“妈妈这个老师讲的真好!”妈妈说道:“那是必须的,这个老师可是知名教练,大学时候是ICPC全国金牌,我们小区那个全市冠军吴刚就是他教出来的。衡水中学开了1200万年薪挖他,他不去。要不是妈妈凌晨一点守在电脑前抢课,根本抢不到呢。
”下课他和妈妈来办公室找到老师,发现老师已经拿着一堆纸在等着他。子明一看,是他参加比赛提交的所有代码,老师已经打印出来了,上面有不少勾圈,显然是认真读过。老师第一句话就是:“这个比赛题目做不出来没关系,赛后分析才是关键。我看了你比赛的代码,比我想象的要好,你如果注意一下细节,这次比赛你就不是一题,而是三题了。
”这句话让子明不敢相信:“三题,要是三题的话我就是前1万名了。“
"你还记得你第二题死活都做不对,一直都是wrong answer吗?"
“是的“
“你把第37行i和j两个变量调过来试试看。
“子明拿出自己的电脑,一调换,提交,发现直接变成漂亮的Accepted了。
“哈哈,看来这道题我还是会做的,这就是低级错误“
老师一脸严肃:“住嘴,什么低级错误,低级错误也是错误!高考犯低级错误,照样没有分数。”
子明沉默了,老师继续说道:“你的代码命名非常不规范,i,j,k横行,而且整体局部不分,前面刚给一个全局变量赋值为 i,后面又把 i 赋值给另一个局部变量。这样的话很容易出错。“
“可是老师,我每一行都仔细检查的,出错的概率很低的。“
“那好,假设你每行出错的概率是1%,很低了吗,那30行出错的概率是多少?“
“26%。“子明拿出手机快速计算了一下。“
对啊,你每个程序写30行,就有26%的概率出错,100分就变成74分了。你高考丢26分,足以让你跟重点大学失之交臂。马虎是不可避免的,你如果能把出错率降到0.1%,那一道题出错的概率就是3%,你就能提高23分,如果你能把你的代码写规范,那足以降到0.1%。注意,所有的马虎都是有因可循,一定要找深层原因,而不是把它仅仅归结于马虎!
“子明默不作声,这些他老师从来都没跟他说过,老师只会说:“马虎啊,那下次注意不要马虎不就行了吗?”但他还是会马虎
“代码规范真的很重要,你知道衡水中学的学生怎么练的吗?他们全校写代码用的都是一个规范,学校自己搞了一个做题系统,学生们在这个系统上做题的时候,如果代码不符合规范,会被直接判错,就算是写对了也没用,因此所有学生写的代码都一个样子。当然我不能要求你这样,但是你一定要留心。
“杨老师喝了一口水,又看了一下子明的代码,继续说道:“然后第三题,我看你已经判断出这道题需要用dijkstra算法了,但是你为什么只写了一个def dijkstra然后就没了?“
“我忘了怎么写了。“
“这个方法其实不难记的,就是建造一个堆,然后每次把权重最小的边抽出来更新,我有一个专门讲这个方法的视频,你把接收器给我,我传给你,你回去好好看看,里面有专门的口诀。“
“好的,谢谢老师!“
“你这两道题都是经过努力可以做出来的,只要做出来,你的成绩就会有飞跃。这些是我一些辅导材料,你回去好好研究一下,以后每周要来定时上课哦。“
子明说完,他妈妈马上跟老师说:“杨老师你看,能不能给我孩子单独开个小灶啊。”“可以,不过这个是另收钱的,每小时5000。““没问题,这个老师您看您什么时候有时间啊。”“这是我的日程表,子明你来看一下,从这个白色区域选两个小时”.......
回家的路上,子明埋怨妈妈:“妈你这是干什么啊,花这么多钱,两个小时都顶我一个月生活费了,咱家又没那么多钱。”“再穷也不能穷教育啊,你考上好大学,能给我省好几千万呢,再说你打网游充的钱也有好几万了,你少充点不就补回来了?”
子明不说话,回去之后开始拿出老师给的资料慢慢看,妈妈则在厨房忙活,给儿子做他最爱吃的红烧牛肉。爸爸每天在公司加班,平时就很晚回家,最近为了不影响儿子备战高考,干脆就住在公司了。“儿子,考上双一流,爸爸带你去你最想去的环球影城。”爸爸和儿子视频聊天,“爸爸,我们班明明她爸爸要带她去月球呢。”“去月球要20亿呢,我一辈子也挣不到这个数啊。”“爸爸我开玩笑呢,明明她爸爸是大公司老总,咱家能跟她家比嘛。”“哈哈哈哈,吓死爸爸了!等你有了出息,还想让你带我去呢。”......
过了一周,子明准时出现在杨老师家里。杨老师很热情招待了他,然后对他进行了辅导。
“这个信息技术高考在我上学的时候并没有,是10年前刚刚加上的。一开始满分是100,而且只在部分发达省份考,后来因为人口老龄化加剧,青年信息人才越来越紧缺,2043年开始上升到了150分,并推广到了全国,统一上机考试,时间两个半小时。
首先是60分的选择题,这个考的就是计算机基础知识,什么windows操作啊,什么进制转换呢,我相信你应该没什么问题,这些题目一定要快,必须1分钟就要一道,30分钟内解决战斗。然后就是6道编程题了,每道15分。
但是高考和比赛的区别是,高考在中间不会告诉你做的对不对,只有考试结束之后才会判分,所以你120分钟做完,和150分钟做完,结果是一样的。这就要求你必须非常仔细,一遍就要做对。不要指望着让OJ帮你调BUG。不过呢,就算你写的不对也没关系,test case和test case之间是相互独立的,你通过了这个test case就给这个分,全通过了就是满分。
另外,高考是不限语言的,但是所有语言的time limit都一样,你用python当然OK,因为运算时间很充裕,复杂度只要正确就行,但是呢,如果你用C++可能会有额外的好处,衡水中学在入学时就强制所有学生都用C++。我记得2044年上海的题目,出题者本来是想要大家用O(n log n)算法的,但是限时给的太长了,如果你用C++再加上一些优化,O(n^2)也能拿满分,最后好多人暴力过了。判卷组本来想缩短时限重判的,结果因为大家已经知道自己成绩,社会反对声浪太大,只好作罢,你看,用c++白捡了10分,还省了大量时间。所以如果你现在上高二,我会建议你改C++,但是你是高三,所以你可以选择不改。
前两道题,就是一些数组,字符串的题目,考察最基本的前缀,后缀,二分,双指针,哈希表之类的,这些题目,是送分题,一分都不能丢的,而且要10分钟一道。
中间两道题,一般是二维数组或者图之类的,需要用到各种搜索,BFS,DFS,或者一些图论基础知识,比如union find,dijkstra之类的,这些题目,如果你想要上双一流,也是必须要拿下的,要做到20分钟一道。
最后两道题要花一个小时完成,第五题容易出奇葩的题目,或者是几个知识点综合起来的综合题,或者需要用到线段树进行优化,甚至可能会出几何和数论。而第六题,就是臭名昭著的动态规划了。这两道题,以你目前的水平,是拿不下的,但是你可以从里面抢分,千万不要空着。注意,你哪怕用最暴力的方法,也能拿到大约1/3的分数,前面如果再不扣分。你就有130了,足够你上双一流的。不过你要是想上清北华五,那就要至少140分,也就是选择题全对,然后最多有一道题只会做small test case,剩下的都要满分。
而且,动态规划,千万不要畏惧,虽然千变万化,其实也可以分成几大类的,背包问题,树形DP,博弈论.....你现在水平不高,你只要记住,动态规划,就是记忆化的递归,你只要往这方面想,绝大部分题目你都是可以解决的,至少可以拿到大部分分数。
虽然题型分布一般是这样,但是高考也有不按套路出牌的时候,比如去年最后一题是贪心+最小堆,而动态规划放到了第三题的位置,难倒了一大片,还有我记得前年某个省,最后一题是概率题,需要用到排列组合,而排列组合需要存储中间结果,取模需要用到数论知识,否则大数据会超时...... 虽然中国剩余定理还有欧拉定理什么的是超纲的,会在考试的时候给你写出来,但是掌握了没亏吃,毕竟时间是最宝贵的.....
最后想说,学习算法,最关键的还是多练习,尤其是练习自己的薄弱环节,刷自己的强项题固然很爽,但是没什么效果。衡水中学的学生,三年下来要做好几千道题,他们每周要搞两次编程比赛,全校大排名,每个班的最高名次和平均名次都会算到教师绩效里。而且,他们搞出来的那个系统,不仅强制学生把代码写规范,还能通过每个学生的答题情况来分析他们的弱点,专门给每个学生出他们大概率做错的题目,比如一个学生binary search已经炉火纯青,但是DFS经常写错,那么系统就会大概率给他出DFS相关题目,很少出binary search。要不说那边学生平时用那个系统做题非常痛苦,但最后高考成绩都很高呢!虽然这些他们老师在课上也说过,但是子明还是听的津津有味。后来老师又给他辅导了几道错题,扩展了很多知识点,两个小时很快过去了,老师把把子明送走,说:“现在努力绝对来得及,千万不要对自己失去信心!只要听我的,把我给你布置的题目刷透,你高考上130没问题。”
在回家的路上,子明充满了斗志,说道:“不就是区区算法嘛,有什么好怕的,来啊高考!看我6月把你打的落花流水!”
这个时候子明的手机响了,是他的朋友小洋:“小明啊,下周日上午我们一起踢球怎么样,咱们初中同学长庚也加入呢。”
子明又有点心痒痒了,想偷偷去,不告诉妈妈,后来觉得有点不好,就在电话里跟妈妈说了,没想到妈妈爽快答应了“你既然跟我说了,说明你现在还是知道分寸的,踢球没什么不好,可以放松你的大脑,你这次可以去,但是你要用一次周赛前1万名的成绩来回报我。”“好!”子明高兴的说道。
夕阳下,一个少年坚定地前行着。