| 荣辉 さんのプロフィール流逝的岁月--不变的热情---永恒的足迹フォトブログリスト | ヘルプ |
|
7月1日 学期总结回顾一下,这个学期弄了些什么:
1) tc. 玩了2个月了,呵呵,真的体会到赚钱的辛苦。通宵的煎熬和胜利的追求,基本使得这个学期dev上目标达成:变黄了. 算法上虽然有点搞事,但是确下降的很厉害。。FT。。div2了。。
2)课程.基本都是应付考试努力一把。不过考前几天奋斗,也弄清小波的基本脉络。数值分析,争取这几天复习回来。感觉数值用处还是蛮大的。
3)专业方向。算是入门了吧。以后要把握时间,好好进一步。
总的来说,tc上混的时间占了多数,变了一个不务正业的学生了-_- ......
6月4日 约瑟夫问题的数学方法(O(n))---转载约瑟夫问题的数学方法 [ 2006-5-5 14:26:00 | By: lower ] 看到这个想起了去年的省赛上,我们就是被一个约瑟夫问题的变种搞的几乎发狂了,一直是WA,出了赛场才发现并 不是真正的约瑟夫问题。 对于约瑟夫问题,今天看到了一篇好帖子,是用数学方法处理的,感觉还不错的 无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂 度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原?侍饨鼋鍪且蟪鲎詈蟮氖だ叩男蚝牛皇且琳吣D庹龉獭R虼巳绻非笮剩鸵蚱瞥9妫凳┮ 坏闶Р呗浴? 为了讨论方便,先把问题稍微改变一下,并不影响原意: 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号 。 我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开 始): k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2 并且从k开始报0。 现在我们把他们的编号做一下转换: k --> 0 k+1 --> 1 k+2 --> 2 ... ... k-2 --> n-2 k-1 --> n-1 变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根 据上面这个表把这个x变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x' =(x+k)%n 如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。(n-2)个人的解呢?当然是先求(n-3)的 情况 ---- 这显然就是一个倒推问题!好了,思路出来了,下面写递推公式: 令f[i]表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n] 递推公式 f[1]=0; f[i]=(f[i-1]+m)%i; (i>1) 有了这个公式,我们要做的就是从1-n顺序算出f[i]的数值,最后结果是f[n]。因为实际生活中编号总是从1开始, 我们输出f[n]+1 由于是逐级递推,不需要保存每个f[i],程序也是异常简单: #i nclude <stdio.h> main() { int n, m, i, s=0; printf ("N M = "); scanf("%d%d", &n, &m); for (i=2; i<=n; i++) s=(s+m)%i; printf ("The winner is %d\n", s+1); } 这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。算n,m等于一百万,一千万的情况不是问题 了。可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。 今天制定新目标 离开ACM之后,依然热衷于算法。呵呵,感觉玩算法和玩游戏一样那么吸引。
去图书馆借了几本书:计算几何,算法艺术,网络复杂度分析。准备认真补一下。有空利用topcoder平台连连编码和思维速度。希望以后有横心坚持下去了。
baidu复赛 当结果不在重要的时候,人就会感觉很无奈。
和小强聊了一晚,引用小强一句话来表达自己的心情把:
小强 00:57:28
我白搞acm几年了 --------------------------------------------
好胜心使得我永远不能停歇。
当A和我说:“你承不承认没有B强”。
我无奈的回答:确实。
这种感觉对于其他人,是琐事,不懈一顾。然而却在我心中印下了深深的足印。不服输,永远都是那么累。
5月29日 busy worker最近真的深刻体会到时间的宝贵。。busy worker has no time to play:)
Excel mean hard working.
Try my best to solve everything.
baidu Astar 2006 题目最近很忙碌,昨天抽空做了一下百度题目。感觉还好吧,只是犯了不少小错误,遗憾了。
/*--------------------------------------------------------------------------------------*/
分析一下题目:
1.百度语言翻译机
此题最快的做法是字母树。可是自己用了hash+bitmap,感觉速度还可以:) 2.饭团的烦恼
此题就是位dp,2^16,递归写起来超简单@-@
3.变态比赛规则
这题我是O(n^4)的记忆化搜索。用了一种技巧合并状态。所以复杂度估计也只有O(N^3), 跑出所有数据在自己机上是5s.代码写的相对简单漂亮。
4.蝈蝈计分
简单题目,只要看明白题目意思。枚举或者位dp之流的做法 5.座位调整
经典ACM题目,费用流或者最优匹配。个人觉得最优匹配快点。
6 剪刀石头布
不错的题目。我得算法如下:
--------------------
思想:
按照式子标号:定义三个集合的符号是0,1,2
如果出现大于号,后面标号是前面的+1模3 等号小于类似。标号矛盾证明此情况下解不存在 过程:
每次加入新的式子,枚举judge,只要枚举可能的judge 如果前面已经否定了judge的可能性,那么后面就不必枚举那个judge了 枚举judge后做一下标号,看看有无矛盾 每次只需枚举到2个judge 如果任何judge都不行,那就无解 judge在标号的时候忽略,不传递 复杂度是O(m^2) ---------------------
复杂度可以优化,没想太多。m^2应该足够了。 这题代码我写的比较漂亮,可惜输入弄错了(判断无解就没有继续读完其他数据)。遗憾了。
/*--------------------------------------------------------------------------------------*/
总的来说,题目质量很高。很多题目优化余地还是比较大,我喜欢。
希望不要因为小问题失误过不了初赛,虽然自己一直遗憾没有拿满分:)
5月23日 补记baidu心情 我写的代码终于在百度上线了:)
猛哥是我百度最好的导师,他教会我很多,最重要一点就是对工作的认真负责。
百度的弟兄们都对我很好,和你们一起奋斗,真的很开心。
如果自己的代码能为几亿人服务,真是太棒了。
虽然我目前不是最top的coder,但我喜欢在追求效率的道路上驰骋。有时候还梦见自己思考着怎么提高浏览速度,怎么做优化:)
|
|||||
|
|