又到了每年的高考。现在看看高考题,感觉真的没什么意思,对于我来说,不该把青春的大把美好时光花在这个上面。只能怪自己当年不够勇敢果断。
刚过去的5月参加了几场比赛,算是过得很充实。我在高中时已经参加过不少学科竞赛,也拿过不少奖,可以算得上“参赛经验丰富”,可是上了大学,竞赛变得和高中很不一样,因为有了队友。高中数学竞赛时,面对做不出来的题,只能绞劲脑汁,冥思苦想,最后不甘地放弃,遗憾终生。可现在不一样了!现在遇到不会的题,可以给队友加油鼓劲,端茶倒水,然后坐等队友AK(all killed)就行了。当然,队友也不一定会靠谱,当队友都一筹莫展,无能为力,准备放弃时,就该轮到我亲自出马,不管三七二十一,一通瞎搞,然后submit。还有就是,数学建模可以使用互联网或求助他人(当然这里会出现不公平竞争),acm可以带模板代码(虽然基本用不上)。
acm像短跑,需要在拼搏中突破极限,而数模则像马拉松,是一种煎熬,一种历练。
5.1~5.3 数学建模校赛
与同专业基友陈玖海,肖日天一起组队打的比赛,选择了预测苏州房价作为课题,比赛要求在三天内建模求解并写出一篇论文。题目给的数据缺失严重,难以分析,所以第一天基本都在网上找数据。陈玖海勾搭了一个统计专业大四的学生,告诉了我们大概思路并介绍了一款统计软件SPSS。第二天我和陈总算找完了数据,并选择用多元线性回归+曲线拟合的方法使房价变为只与时间有关的函数。我飞快地学会了SPSS并跑出了一些结果,然后用excel做出了漂亮的图标,肖昊打开ctex开始写文章。
当我把所有拟合后的函数加起来,得到了目标函数,喜闻乐见的事情发生了:它大体上是一个首项小于0的三次函数,也就是说随着时间流逝房价会逐步下跌,越跌越快,最后到达负值!海了(北方方言:坏了)我心里有一亿只草泥马飞过。后来只能使用某些特殊的处理手段,把苏州市放假调整回了正常的轨道,苏州人民又要生活在水生火热当中了。出现这种情况的主要原因还是方法的不科学性,无论在选取自变量,数据处理,时间分析,曲线拟合过程中都有不科学的地方,这些误差累计起来就导致了毁灭性的后果。
后来我又照着陈借来的书试着做了主成分分析,分析出来主成分只有一个,只能放弃。又在周圣高的建议下做了交叉验证,肖昊写出了不错的论文。
自我感觉作为第一次数学建模,能做成这样已经很不错了,最后水了个三等奖也差强人意。但是不爽的地方在于,拿一等奖的队伍居然也用的同样的方法!并且在很多方面私以为做的还不如我们,比如选取变量上。并且我们用ctex敲的,排版也不可能比word差。所以说,建模比赛的成绩,就和高考作文阅卷一样,就算自己再怎么努力,有些主观因素还是没办法全部避免的。
总的来说,还是很满意的一次建模经历,队友都非常给力,我也没打酱油。
5.8 江苏省程序设计竞赛 JSCPC 2016
相比于数模主观性较强,程序设计竞赛则是绝对公平的竞争。在5个小时的有限时间内,一组三人需要挑战十个问题。每个问题有具体描述,样例输入,样例输出,需要挑战者用程序设计语言编写一个程序满足题目给定的要求。
我和计科院的徐进叔叔,纪杨聚(lao)聚(ban),组成了“神之救济”队伍,赛前也进行了不少的训练。我们是典型的“一奶带二战”队伍,我由于敲代码手速慢,只好专门负责当奶妈,给两位代码手加油鼓劲。徐进叔叔切水题模拟题很稳,纪老板全面能搞,手速爆表,我和纪老板一起讨论偶尔能解决几道难度稍高的题。
徐进叔叔是个有故事的人,但讲了就偏离了这篇blog的主题,大家可以去理工楼117与他交易。
实际比赛并没有想象中那么顺利,热身赛虽然理论ak,但由于我手残,实际爆零,之后正式比赛我就没怎么摸过键盘,徐进叔叔总是在尝试他的黑科技。正式赛开始后我们三个就一直处于瑟瑟发抖的状态,拿着题目不知该如何下手。40min后纪杨C题有了思路,那道题是要求圆分为n个扇形染k种颜色的染色方案数,由于数据量非常水,用哈希加dfs暴力搜索ac(accepted的缩写)了。多谢南大把那道题的数据范围给改小了,原来10的9次方要用到波利亚计数原理,肯定做不出来。
之后就顺利了许多。B题是树的中序遍历,徐进费了一些功夫敲完了。A题是大模拟,题意比较难懂,理解了题意之后徐进和纪老板一起敲完了。说到理解题意,不得不说说那本我从实验室找来的字典。由于题目是英文的,有好多单词都不认识,结果查了不下5个单词。字典里面都!没!有!我那是真的当场就想把字典撕了,只好瞎逼猜题意。
我们在第二个小时做完3题之后,冲到了铜牌区的位置(排行榜可以实时查看),在队友敲大模拟期间,我一直在看F题,那道题是这样的:
有n(小于10万)个人,第i个人有ai块钱,钱多的人要转钱给钱少的人,直到所有人的钱一样多,在转钱时银行会收取一定利息,问最后他们最多能每个人剩下多少钱。
我很快就理解了题意并推出了样例,并察觉到了解题的第一个关键点:假设最后的答案是t,那么在转钱的过程中,转出的人剩下的钱数不能小于t,转入的人剩下的钱数不能大于t,否则会有多余的利息损耗。之后我就一直在想怎么求解t,想了大概有45min终于想到了一种做法,用一个长长的公式把t求了出来,1发ac,耗费了不少脑细胞。赛后和学长们交流了一下,得知他们都是用二分查找做的,确实巧妙!我还是典型的数学思维,总是想着求解,实际上,1秒钟能算几亿次不会出错的计算机,哪像人类这种一秒钟只能算几次还很容易出错的低能生物一样,需要这些巧妙的公式?
为什么可以用二分查找?我们先对数组a1...an排序,那么最后的答案肯定在a1到an内。我们每”猜“一次答案t,可以立马计算出比钱比t多的减少到t,和钱比t少的增加到t再乘上1减去银行利息,并比较这两个和谁大谁小。然后就可以知道自己”猜多了“还是”猜少了“,不断二分,至多询问30次就可以保证0.000001的精确度,复杂度为n(lnn)。之后我在cf上多次碰见二分查找求答案的题,都会感慨自己当时太傻逼。
然后我费了一番功夫读懂了一道博弈题并与队友讨论,徐进肮脏地猜了一个答案,我想了一会儿,列了一个方程组出来,发现徐进猜的正好是方程组的解Orz。这题答案也太水了,简直就是全场最水题,就是因为题意太难懂,导致一开始没什么人过。然后还发生了一件很搞笑的事情,我们交了之后发现WA(wrong answer)了,队友们都以为是答案猜错了,我又想了想,还是不信邪,看了一下提交的记录,发现我们交错题号了!交到了图论那题(大概是I)之后交对题号就AC了,最后我们图论那题也没过,纪老板用prim算法敲了一发又超时(Time Limit Exceed)又爆内存(Memory Limit Exceed),其实之前训练时已经暴露出来了,我们三个人只有纪老板会一些图论,总的来说非常薄弱。
我们三个小时不到过了5个题,凭借0罚时冲到了银牌区的末尾。可是接下来的2个小时一道题也没做出来TAT,一道刚刚那个傻逼图论题,一道gcd的题目,基本没几支队伍过,学长说是莫比乌斯反演,当时我肯定不会,现在也不一定会...然后就是那道逗逼的机器学习的题目了:
样例中提供了中文拼音、西班牙语、英语的文本,做一个程序,能够自动识别出这三种语言。
这道题其实用笨办法就能过了,就是把样例中的文本全部抄下来,然后字符串匹配比较得分,但是一般人都会自作聪明,想着怎么偷懒,就挑短的单词,然后又自己造了一些单词,比如Nanjing University,比如boy next door...然后WA了9发,比赛就结束了。听说通神的队伍WA了19发才过,可攀的队伍也WA了8发,并因此与冠军失之交臂。真是一道坑题。最后我们拿了二等奖。
总的来说,还是自己太菜了,会的算法也太少。最近也敲了不少代码,争取早日脱离手残。
还有一场建模比赛复旦华东杯,非常具有戏剧性。周日的晚上,当我和肖昊说:今天就到这里,我们明天再战。旁边也在建模的马云涛夫妇一脸疑惑的看着我,他们带给我一个令人绝望的消息:周一早上7点前交论文!主办方是傻逼吗?哪有这么定时间的?我们一直以为是晚上7点前交。最后只好一通瞎搞到凌晨两点。
和队友一起并肩作战,一起绝望,一起excited,真的是一件很开心的事。对我来说,最值得信赖的伙伴,则是眼前的计算机。它不会运算出错,不会背叛你的任何命令,借助它的力量,我能突破人类的极限,探寻到一丝真理的光芒。谢谢你。
打这么多字累死我了,大家下次见。