跳转至

保研推免经验分享 - 数学系跨保 CS

个人背景

  • 学校:南开大学数学系(信息与计算科学方向,专业综合排名:4/18)
  • 竞赛:2017 数学建模美赛 M 奖;2016 数学建模国赛省二。
  • 科研:加入实验室蹭了一个和某医院合作的肿瘤识别项目(图像处理);跟着一个博士师兄做了个『生物信息』方面的小课题,水了一篇 SCI(三区,并列一作)的小文章。
  • 实习:北京中天联科科技有限公司(暑期实习,AI 相关)
  • 其他:一些个人开源项目;此外,承接数学院老师的需求,开发过两个小网站。

基本情况

取得 Offer:

  • 清华大学-计算机系-计算机技术(深圳研究生院)
  • 中科院信工所-第三研究室-信息安全
  • 南开大学-数学系-生物信息学

最终去向:清华计算机(深圳研究生院)

夏令营

在夏令营之前,因为之前一直跟着系主任在他实验室做科研,对我还算是比较认可,答应我研究生可以继续跟着他做(生物信息学),还帮我联系了一个暑期实习。有了这个 Offer 之后,便没有去报本校的夏令营。

外校的 CS 相关夏令营只报了中科院的自动化所和信工所,由于夏令营一般初审筛人很厉害,两个所都是被刷了下来,感觉主要还是成绩和排名不行导致的。但是由于往信工所投过简历,似乎那边的老师对我的履历有点兴趣,于是又被叫去参加一下他们的预推免面试。

信工所总体而言是做信息安全方向的,分为六个研究室,一三研究室近些年合并为国重,做的东西相对偏理论一点,二室比较全面,做信息处理、数据分析、机器学习这块儿,理论和实践结合地比较好。四五六研究室不是特别了解,大概是做网络攻防、网络空间安全。信工所的考核是这样的,只能选择一个研究室前去考核,需要在他的系统里填一次志愿。由于三室不考机试,当时准备不足不敢考机试,加上三室也确实对我胃口,于是果断报名三室的考核。

由于我是补录参加夏令营预推免,就只是参加一次体检+一次面试,不包吃不包住,跟正式的夏令营营员待遇真是天壤之别,他们包吃住,带着各种参观各种活动,还可以与导师自由交流,而我则是附近找了个小酒店艰苦地住了两天,真是一把辛酸泪啊。

众所周知,参加夏令营很重要的一环就是找老师套词,由于通知我补录进去的消息很晚,估计老师们schedule都排得挺满了,投了七八封简历后,只有一个老师同意见面、一个老师客套地回我“参加统一面试就行”,其余老师都没消息。

那天跟老师谈话的进展还不错,没有考我任何专业问题,就是很随和地聊天。老师比较年轻,很有共同话题,也表示对我这种数学背景的学生比较感兴趣,因为他们这里也有做理论的需求,当时直接就表示欢迎我去信工所。听到这句话一下就放心很多,意味着后面面试只要正常通过就好。

第二天正式面试的时候,进去有五个老师坐在对面,有一个老师笑嘻嘻的感觉很有趣,有一个比较和蔼,剩下三个都蛮严肃。简历递过去,首先就是简短地自我介绍,介绍后就主要问了我一些项目的情况,没有考我任何数学和计算机的知识,最后就是用英语再简短地介绍自己,主要是看看英语怎样。值得一提的是,我面试的时候虽然没有考我任何问题,但听我前面一个女生(恰好她也是数学系的)出来说考了她一堆群环域和代数的知识,我当时还紧张了一下,因为很久不碰我忘了不少,结果可能是因为我项目写得太多,时间都被拿来问项目的情况了,所以这里建议大家以后写简历,尽可能丰富一下科研和项目经历,有些老师会比较感兴趣。

面试完后几天,拟录取的邮件就发了过来,当时感觉非常开心,因为信工所还是比较符合我的兴趣,我也比较懒不想再跑来跑去,后面就暂时没了进一步的打算,没去打算再搞九推。接着就去北京做暑期实习,打算就这样把剩下的暑假度过就行。但正当我做着实习的时候,一个让我不得不又行动起来的机会出现了。

预推免

在我做暑期实习的时候,当时差不多八月底了,突然之前联系过的清华的xst老师让我去报一下清华的预推免。我是之前六月底,他当时是来我们学校做一个报告,那时借机跟他见了一面。当时听了我的情况后,表示履历和背景还可以,但是成绩和排名确实不是很理想,说是后面会再看情况去试试清华的预推免。当时我以为这是一种婉拒的意思,也理所当然的接受了“婉拒”的事实,没想到后面还真的让我去参加清华的预推免。

得到消息的时候先是开心了一阵,感觉也许可以拼一波,接着便开始郁闷起来,要在短短半个多月准备好机试+面试,白天还得做实习工作,这可真的不好办啊。不过既然机会难得,去尝试一波又不会有什么损失,所以还是认真准备了起来。

清华计算机系的推免机试是三道题,做四个小时,形式是OI赛制,也就是按数据点给分,实时出分,这就意味着即使是难题也有可能拿到部分的分数。可以带纸质材料(任何是纸的东西都能带,甚至可以把《算法导论》搬进考场2333),所以提前准备好模板是很重要的。

刚准备机试的时候,我算法这块儿还是 0 基础,C++也忘了不少,在知乎和CSDN上逛了逛,选择用“杭电ACM入门课件”来入门。知识点的话,去问了问同专业的wlp大佬,告诉我只需要重点看“并查集、图论、bfs、dfs、动态规划、筛选法、递推、简单数学题”,再稍微看一看STL库里面的常用函数就行了。所以前面提到的那套课件只需要看掉一部分即可。书的话我是稍微配合《王道论坛计算机考研机试指南》(适合新手入门)和刘汝佳的《算法竞赛入门经典》(紫书),然后跟着那套课件刷HDOJ上面的题。后面课件看完后,我找到了洛谷这个OJ,感觉相对比较适合新手,在这上面做了几个专题训练,主要还是针对前面那几个知识点重点刷了刷题。

刷题的过程中,我都把刷过的题目记录在Github上,再随手做了点笔记把自己感觉需要注意的东西记了下来,这里给同为新手入门的同学分享一下:zawnpn/OJ-Exercise(大佬请无视)。另外也从wlp大佬那里拿来他的模板,再根据自己情况加了些东西。模板是\LaTeX格式的,只需要引入源代码文件即可,这里也分享一下吧:zawnpn/Algorithm-Template

然后9月16日去参加机试,机试前看了看贴在公告栏的通知,具体的环境如下:

语言和编译器

  • C: GCC 7.3.0,编译选项包括-O2和-DONLINE_JUDGE,可自选-std=c11、-std=c14
  • C++: GCC 7.3.0,编译选项包括-O2和-DONLINE_JUDGE,可自选-std=c++11、-std=c++14
  • Java: OpenJDK 1.8.0, javac 10.0.1
  • Python2: 2.7.15rc1,内置标准库
  • Python3: 3.6.5,内置标准库

评测机环境

  • 操作系统:Ubuntu 18.04 64-bit
  • 编译器:同上

工作环境

  • 编译器:同上
  • 操作系统:Ubuntu 18.04 64-bit
  • 文本编辑器:gedit, vim, gvim, emacs
  • IDE:VSCode, atom, codelite, codeblocks
  • 调试器: gdb, ddd
  • 其他:Firefox, chromium, python2, python3, gimp

看完通知,发现居然支持Python来做题了,可把我看呆了,虽然平时作项目Python用得多,但刷题都是练的C++,完全不敢用Python啊,指不定遇到什么坑呢。操作系统这块儿,平时一直在用Archlinux,所以也不用担心不适应什么的。编辑器我平时主要用VSCode和Vim,模板里也带了Vim的配置(但是没带VSCode的,太多了),所以编辑器也没太操心。开考前有30分钟的试机时间,利用这个时间可以把你带过去的一些配置赶紧敲进去。然后给了两个试机测试题,可以简单做做看看OJ是否正常(测评环境是TUOJ,平时好像是不开放的)。

下午一点半正式开考,题目发下来,大概是这样的:

  1. 大模拟,让做一套多人贪吃蛇对战游戏的逻辑;
  2. 在一个环上,可以任取 某一段连续子段 ,剪下来反转后放回去,问:为了使环上各个连续子段的和的 最大的一个 要尽可能大,应该怎样剪;
  3. 求一个环上的最长上升子序列(非严格递增)。

下面再给大家提供一份扫描版

p1 p2 p3 p4 p5 p6 p7 p8

[PDF]清华大学计算机程序设计水平测试-推研机试(扫描版)

毕竟是数学系跨保,这里基础上的不足就体现出来了,拿到题非常不自信,当时考虑的是尽可能把第一题这种不需要算法的模拟题的分尽量多拿一拿,结果就是因为这个想法把我坑了一把,因为第一题的条条框框实在太多,而我当时一心想着多拿分,所以想尽量做得更完善,越往后面做越发现不对劲,感觉有点做不动了。而实际上因为这道题分很多数据点,前几个case的数据条件其实要少很多限制,如果安心只打算拿前几个case的分,其实应该能顺利地做出来。结果浪费了两个小时在第一题,却毫无收获,依然是 0 分,这时候就很慌了,赶紧改掉改成针对简单数据点的逻辑,但由于心烦意乱,改出了各种bug,最后果断跳题,先不管这题。

看了看第二题,感觉不是很熟,再看一眼第三题,只是把LIS改在了环上面,然后变成了非严格递增,感觉这题能做,于是开了第三题。我是通过把数组切割组合成不同的多个新数组,然后对每个新数组求一遍LIS,最后取个最大值,这个算法会超时我是预料到的,但肯定能保一定的分,果然judge完后,后面几个数据点TLE了。但好歹拿到一定的分,心里总算是舒坦一点。看第二题还是不打算去做,算法这块儿不熟的话真的很没信心去做,加上第一题感觉还能抢救,于是又果断回到第一题。然而事实上,到最后第一题还是没能拿到分,当时感觉逻辑上对于前几个数据点差不多写对了,但跑出来就是不行,最后到点交卷,我的分数就定格在第三题的那几十分。总体而言,这次机试还是吃亏在经验太少、练题不足。

当时出来感觉可能有点凉,然而后面一个负责招生的学长告诉我大家都考得不是太好,不知道只是安慰还是真的,总之算是安心了点。

第二天是直博面试,我因为报的直硕,要再过一天才面试。直博面试不通过的好像还能进第二天的直硕面试,所以有条件的大佬还是多报报直博吧,多一层保险。

第三天终于到面试了,先是一轮综合面试,让你用英语做个自我介绍,问点英语小问题,再用中文问你点心理方面的问题,不涉及任何专业问题。接着就是老师的专业面试,大概有十多个老师(之前还通知说有40个老师让至少准备40份简历2333),发完简历后台上讲5分钟ppt,接着老师问点问题,因为我是数学系的,没问我任何计算机问题,先是问了点群论的概念,然后问我高斯过程,最后问了下实变的一点概念,有的答了上来有的忘了,最后问了下为什么有些课程考得不行,以及我写的这个排名是跟哪些人一起排名的,之后问我是否接受去深圳研究生院,我当然是愿意啦,然后就结束了。

之后过了一两个小时吧,在回住处的路上,xst老师发来微信告诉我机试和面试都还可以,可以发 Offer,当时真的超开心,感觉一直以来的认真准备终于得到了回报,赶紧把结果告诉了爸妈,以及几个一直在支持和鼓励我的同学。

值得一提的是,面试完当天(9月18日)会出一个“不录取名单”,不在名单上基本上就是录了,但是正式的通知大概要等到推免系统开始填志愿的前一天(今年是9月27日)才在学校的报名系统上查到,第二天登录学信网填志愿,然后保研就算告一段落啦

总结

目前就先写到这里吧,后面想到什么再补充,希望看到这篇文章的各位也能收获到自己心仪的 Offer。