今天是自闭的第一天,上午的开营仪式wls从生物演化的角度切入,让我们思考了几个问题“为什么学算法”,“是什么阻碍你学算法”......听完感觉自己又懒又菜,其实心里倒是很希望自己能像他们一样站在台上像其他人传输自己的知识和理念,但是却没有真正把这件事情作为一个目标来提升自己的能力。刚开始接触这一块的时候确实是带着兴趣在学,但是过了一段时间碰到困难后又觉得索然无趣,慢慢坚持积累过后似乎也觉得挺有意思的,但我已经想不清楚自己当初到底是为什么来学这个东西了,在很长一段的学习过程中也只是盲目的学,为了拿牌子,为了以后好找工作,为了加学分......所以一直菜到了现在呜呜呜。听了wls和momenta的夏炎女神的介绍之后还是很有启发的,以前身边的大部分人都说算法在实际工作中不常用,使个人对打ACM之后的方向有些不明白,以为只能用在机器人什么的非常高端的应用场景。。。wls总结了算法发展的三个阶段,从简单依照某种原则来解决问题(例如:先打个暴力),再到对某些规律进行总结来解决问题(例如红绿灯的调整),再到更高级的阶段的机器学习,使算法能够根据实际情况自我调整来解决问题,每一个阶段都是在加深人对机器的使用,使人类的劳动力能更好的解放出来,去做一些更有意义的事情。这些东西是我以前完全没有接触到的,感觉又打开了一个新的角度看问题,想从camp开始好好做人。。。(上午接触的新鲜东西挺多的,理解的肯定有不到位的地方,可惜不能再听一遍了)
下午一点半开始第一天的训练赛(由于OJ比较新的问题推迟了一会儿),第一天的比赛共11题呀,我们队做出来了两道
A.机器人
因为要用最少的时间经历多个点,在这里也就是求最短的距离。重复的路径不会到达更多的点,并且从原点出发之后需要回到原点,所以尽量画矩形是最好的方式。
在草稿纸上瞎画以及思考中发现问题可以分为几类。
1.两条线上都有点或只在第二条线上有点.
1.第一条线上的点都在s的一侧,并且第二条线上的点的两边最近的特殊点都在s的同一侧.
2.第二条线上的点的两边最近的特殊点横跨s.
2.只在第一条线上有点.
1.点都在s的一侧.
2.点横跨s.
3.只有s一个点.
F.爬爬爬山
题目大意是有n座山,每座山有高度,wls每往上爬1m要耗费1体力,往下爬1m就回复一体力,体力不能小于0,将山降低l m需要花费l * l , 山之间有路径,给出每条路的花费,问从第1座山走到第n座山的最小花费。
读完题的感觉有点像分层图最短路?因为每座山有降低和不降低。再想想就发现体力的限制其实就是对wls能达到的最大高度的限制,然后超出这个最大高度的山肯定是要降低到最大高度的,要不然就没必要连边了,于是决定先求出每座山是否超出最大高度,以及求出降低他们所需的代价,因为这个代价只有在走到这个山才会加上,所以给每座山的入边加上这座山的代价,最后跑最短路。事实上刚开始有这个想法的时候感觉直接修改边的值有些奇怪,怕出错所以用拆点法做的,感觉拆点法在写网络流的时候用的挺多的,可以把点上的权值转移到边上,相当于只在点的内部做修改而不用影响边。建好图跑一遍SPFA就可以了。后来想明白了SPFA每条路径上的点只会走一次,因为这个图没有负权边,所以最短距离的值肯定是递增的,再次走到这个点也不会入队,所以不会经过第二次。
虽然思路想的听明白的,但是还是没能自己A掉,原因有两点,
1.long long的数组开的int
这个坑以及踩过无数遍了,我记得我写完代码好像还想起来了,不知道为啥没看出来。。。
2.拿vector写SPFA超时了
这个好像也是历史遗留问题了,之前打比赛板子出过锅,就自己拿vector随手写了写,最后果然还是链式前向星快。
总结起来,看到问题有时候有思路却不一定能够很快的想出来,赛场上得多笔画笔画加快自己对样例的理解吧,然后还是有很多历史遗留问题要改了,听了题解之后感觉B题应该也在能力范围之内,C题能蒙蒙??当然训练的话还是得搞懂,因为之前总是看着以铜牌为目标,对数据结构的掌握往往只停留在套模板阶段,有些题听题解也有些自闭,不过多点时间是能补上的。