走过的路偶尔回头看看也是好的,这一个暑假训练真的说是感觉枯燥,最开始刷题真的会刷草鸡的。。。。。。不过这个枯燥的过程不就被众人称之为努力么。 哈哈哈
刚刚写了一大串没有保存下来,网页未响应全部没了。。这个难受。
再说这个暑假的训练吧,最开始刷的是Euler的题,这个网站上的题确实好,非常锻炼数学思维,这个系列的题目也是一个由易而难的过程,最开始的时候一天十个。。。啥?这么简单。。可到后面一上午出一个。。。
记得有一道题说的是给你一个N*N的方格,让你求从左上角走到右下角的路线数目。比如2*2的时候就是一田字格,这时有六种。1*1的时候当然只有两种啦。最先想到的就是斐波那契数列。试试水吧那就,WA。。那咋搞??(这里先不说正确的数学解法) 那我就在画路线,左画右画咋看咋想一棵树,最后画着画着真的能画出正确结果,接着往下画下一个,是想画法真的有无数,那应该怎么画?肯定有一定的规则,具体那种解法我不记得了,这里也不详说。换个思路,该题最正规的数学解法就是一组合数学。为啥呢?你想啊,你从左上角走到右下角,要不往右要不往下。还是一个2*2的田字格,不就一共走四步,两步往下两步往右,哇很简单的。C42,这不就是四步选两步吗。正正好的6步。这么简单为什么想不到呢?
问题转化的能力,上面说的例子就是在强调需要有思考问题转化问题的习惯,突然又想到前几天的练习赛,C.E题没人出,老师说看CE,结果半天还是没几个人出,那么问题来了,这两道题到底多难呢?
且听我娓娓道来,E题说的是奶牛在牛槽挤奶,在某个时间段内,有X头牛,在1-M时间段,每头牛有自己喜欢的时间,两头牛不能在同一时间同一个槽里。求最少需要几个槽。
妈呀,这咋整?一看,贪心! 然后呢你咋实现?再一想,背包? 时间当作容量????不科学不科学,恩,然后想到求时间重叠的最大数不就行了么,要说是这样的话,问题就很简单了。但是人家出题人不想你用这种方法水题,他就加大时间,让你让你TLE(超时),那这到底是啥,还不是背包。比赛时候就一直很愁啊。 然后比完赛,鹏哥说,CE两题咋都没人出,很明显两道水题。 啊啥?喵喵喵?E题什么思路? 一个优先队列啊。 我的个乖乖,可不真是。 学了那么些数据结构不知道往上用。。。
这就说要会灵活变通啊!知识是死的人是活的,老话都念烂了。ACM难在哪?有啥难。题目在怎么出不是解的?我能想到的最难的题目不过是几种算法相交外加上个数据结构,不过这种题别说我没见过更没听过,出这种题会不会被骂死啊哈哈哈。但是我要说的是,问题都不难,你要会剖析问题。每个局部实现最优不就是整体最优嘛!什么,你不信?别急,听我给你吹。
为啥说要会剖析问题,因为它有用啊。再举个题,* * * * * * * * *
A A
A
S * * * *
A A A
功力有限就画这样了,你从S开始走,你可以在任何时候任何地点分裂,分裂体走的步数也要计入,求走完所有的A最少需要几步。你看看吧,你要是想一股脑想模拟的话。。
嘿嘿,不存在的,模拟DFS你解不出来,那你肯定会接着想这是什么算法呀?搞半天没用。所以你要剖析问题!!! 说一下,你要求的不就是步数吗,或者说是距离。这题就是一BFS预处理+ 最小生成树。咋的,你仔细想想是不是这么回事。S到任意A的距离你在图上连线,那么你连出结果的那一种连法的时候。很明显的最小生成树!但是你不知道距离啊,不怕,来一个BFS求距离。好了问题解决了。
好了你仔细想想这个套路是不是很有用呢,步步高打火机,哪里不会点哪里。一旦剖析了问题,难度就会大大下降。还有思路要广,不一定哪一种方法就能解出来,个人崇尚暴力大法。什么题不能暴力做呢啊哈哈哈,不过暴力也要暴力的优雅有套路。那就是剪枝,无脑暴力那是傻。
发现了一个小小的小窍门,每个题都会用到两个以上的知识点(或是算法或是数据结构),那种单一的题目没 意 思。
以上是我总结的解题方法,一套思路。可能有的地方还没想起要说什么。
千篇一律的想、看,不如你书写一遍,比如你开始接触树状数组,哇,这个东西一开始接触是真的难想,直接自己编一组数据输出很容易看清它的结构。说起来也真的很佩服发明这个数据结构的人,把一个一维的数组变成了一棵树。很有趣,现在想一想,一个一维的数组好像是一条线,树状数组则是像梯田形状的一条线。那么,以后会不会有人将这条线弯成圈呢?或许像蚊香那样。
反正明白了知识点不还是要做题吗。
DP专题感觉很有意思,嘿总结状态方程啊。至于DFS啊哈哈 上下左右移动啊,有时候再加个判重。 BFS才是大BOSS,为啥这么说,BFS可以单独出题,双向BFS,尤其数据大的时候要往这里想,另外BFS也可以作为一种工具,常用在图论预处理。
组合数学也很有意思,怎么说呢,前几天做了一道组合数学的题目,哈哈很遗憾当时没出,自己写了一遍理所当然的TLE,后来看了题解知道了那道题和我的思路完全一样。。。。。。。好气啊,不过那人用了组合数打表。。。。
等一下忽然想起离散化,离散化在我看来就是我说的剖析问题。嘻嘻,关于离散化下面这篇文章说的就很好
Matrix67原创 Trackback: http://www.matrix67.com/blog/archives/108
举同样的例子UVA1073题:
题目意思很简单,给定平面上n个点的坐标,求能够覆盖所有这些点的最小矩形面积。这个问题难就难在,这个矩形可以倾斜放置(边不必平行于坐标轴)。
这里的倾斜放置很不好处理,因为我们不知道这个矩形最终会倾斜多少度。假设我们知道这个矩形的倾角是α,那么答案就很简单了:矩形面积最小时四条边一定都挨着某个点。也就是说,四条边的斜率已经都知道了的话,只需要让这些边从外面不断逼近这个点集直到碰到了某个点。你不必知道这个具体应该怎么实现,只需要理解这可以通过某种方法计算出来,毕竟我们的重点在下面的过程。
我们的算法很显然了:枚举矩形的倾角,对于每一个倾角,我们都能计算出最小的矩形面积,最后取一个最小值。
这个算法是否是正确的呢?我们不能说它是否正确,因为它根本不可能实现。矩形的倾角是一个实数,它有无数种可能,你永远不可能枚举每一种情况。我们说,矩形的倾角是一个“连续的”变量,它是我们无法枚举这个倾角的根本原因。我们需要一种方法,把这个“连续的”变量变成一个一个的值,变成一个“离散的”变量。这个过程也就是所谓的离散化。
我们可以证明,最小面积的矩形不但要求四条边上都有一个点,而且还要求至少一条边上有两个或两个以上的点。试想,如果每条边上都只有一个点,则我们总可以把这个矩形旋转一点使得这个矩形变“松”,从而有余地得到更小的矩形。于是我们发现,矩形的某条边的斜率必然与某两点的连线相同。如果我们计算出了所有过两点的直线的倾角,那么α的取值只有可能是这些倾角或它减去90度后的角(直线按“”方向倾斜时)这么C(n,2)种。我们说,这个“倾角”已经被我们 “离散化”了。
解题先读题
转化题目找算法
对算法的优化和对数据的处理
解题就是这么一个过程。我的感受是做什么事情都是在理解,理解的好做起来也会好得多啊。膜拜大牛们。