荣辉 さんのプロフィール流逝的岁月--不变的热情---永恒的足迹フォトブログリスト ツール ヘルプ

朱 荣辉

フォト アルバムがありません。
リスト項目が追加されていません。
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,但我喜欢在追求效率的道路上驰骋。有时候还梦见自己思考着怎么提高浏览速度,怎么做优化:)