记08年北大ACM选拔赛

    早晨7:40的闹铃。到36楼下面见到了我的两个队友后,随便吃了点东西就出发了。
    计算中心门前特别热闹,N多人围在一张大桌子前,好像是在签到。我挤进去找了半天发现没我的名字,名单上全是信科的人。我抬头问,中文的在哪儿呢。一个美女姐姐用手指了远处的一个几乎没人的地方说“中文的在那边”,并说了一句“哇,中文的呀,太牛B了”。我顺着她手指的方向望过去,另一张小桌子前面贴了“中文”二字,桌子后面没有人,估计是交给了旁边负责数院和元培的人,让他们顺便管一下。从我目前所了解的情况来看,那张桌子应该是特别为我准备的,它在历史上很可能是第一次出现。

      
    第四题是做得最顺利的一道题。我把所有题粗略看了一遍后,首先决定就想这道题。题目描述巨简单,就是问你沿对角线把一个正n边形剖分成三角形和四边形有多少种方法。上图显示了n=5时所有的10种方法。熟悉组合数学的人都知道,三角形剖分方案对应的是Catalan数列,其递推公式的推导相当经典。设C(n)表示凸n+2边形的剖分方案数,枚举底边和哪一个点相连(下图左),容易看出C(n) = C(0)*C(n-1) + C(1)*C(n-2) + … + C(n-1)*C(0)。
    
    现在,如果剖分中允许有四边形的出现,又该怎么办呢?看看数据规模n≤5000,估计应该是叫我们寻找类似的递推公式。容易想到,我们可以枚举底边与哪一个点相连构成三角形,统计出底边属于某个三角形的剖分方案T(n)=ΣC(i)C(j), i+j=n-1;再枚举底边和哪两个点相连构成四边形,统计底边在一个四边形上的剖分数Q(n)=ΣC(i)C(j)C(k), i+j+k=n-2。但是,枚举四边形需要O(n^2)的时间,这样的话整个程序就是O(n^3)的了,n=5000绝对超时。那怎么办呢?两分钟后,我想到了一个具有决定意义的点子:计算Q(n)可以直接利用以前算过的T(i)。枚举四边形的两个顶点时,固定四边形的左边那个顶点,你会惊奇地发现右半部分的所有情况加起来正好就是一个T(i) (上图右)。因此,ΣC(i)T(n-i-1)就是我们所需要的Q(n)。
    一个有趣的细节是,这道题要求选手输出结果除以2^64的余数,不知道会不会有人想不到这个该怎么处理;事实上只需要直接用64位无符号类型来运算就可以了,超界了后计算机储存的本来就已经是2^64的余数了。

Read more…

分享一些有趣的面试智力题(下)

    12. 两个机器人,初始时位于数轴上的不同位置。给这两个机器人输入一段相同的程序,使得这两个机器人保证可以相遇。程序只能包含“左移n个单位”、“右移n个单位”,条件判断语句If,循环语句while,以及两个返回Boolean值的函数“在自己的起点处”和“在对方的起点处”。你不能使用其它的变量和计数器。
    答案:两个机器人同时开始以单位速度右移,直到一个机器人走到另外一个机器人的起点处。然后,该机器人以双倍速度追赶对方。程序如下。

while(!at_other_robots_start) {
  move_right 1
}
while(true) {
  move_right 2
}

    13. 如果叫你从下面两种游戏中选择一种,你选择哪一种?为什么?
      a. 写下一句话。如果这句话为真,你将获得10美元;如果这句话为假,你获得的金钱将少于10美元或多于10美元(但不能恰好为10美元)。
      b. 写下一句话。不管这句话的真假,你都会得到多于10美元的钱。
    答案:选择第一种游戏,并写下“我既不会得到10美元,也不会得到10000000美元”。

Read more…

分享一些有趣的面试智力题(上)

    偶然进了这个页面,看到几个原来没见过的面试智力题。顺带也翻译一些比较少见、可能有人没见过的题目写在这里。有几个题目在国内流传相当广,什么n个人怎么分饼最公平,屋里的三个灯泡分别由哪个开关控制,三架飞机环游世界,用火柴和两根绳子测量45分钟之类的题目,火星得已经可以考古了,这里就不再说了。个别题目本Blog原来有过详细的介绍,这里也不再提了。

    1. 考虑一个双人游戏。游戏在一个圆桌上进行。每个游戏者都有足够多的硬币。他们需要在桌子上轮流放置硬币,每次必需且只能放置一枚硬币,要求硬币完全置于桌面内(不能有一部分悬在桌子外面),并且不能与原来放过的硬币重叠。谁没有地方放置新的硬币,谁就输了。游戏的先行者还是后行者有必胜策略?这种策略是什么?
    答案:先行者在桌子中心放置一枚硬币,以后的硬币总是放在与后行者刚才放的地方相对称的位置。这样,只要后行者能放,先行者一定也有地方放。先行者必胜。

    2. 用线性时间和常数附加空间将一篇文章的单词(不是字符)倒序。
    答案:先将整篇文章的所有字符逆序(从两头起不断交换位置相对称的字符);然后用同样的办法将每个单词内部的字符逆序。这样,整篇文章的单词顺序颠倒了,但单词本身又被转回来了。

    3. 用线性时间和常数附加空间将一个长度为n的字符串向左循环移动m位(例如,”abcdefg”移动3位就变成了”defgabc”)。
    答案:把字符串切成长为m和n-m的两半。将这两个部分分别逆序,再对整个字符串逆序。

    4. 一个矩形蛋糕,蛋糕内部有一块矩形的空洞。只用一刀,如何将蛋糕切成大小相等的两块?
    答案:注意到平分矩形面积的线都经过矩形的中心。过大矩形和空心矩形各自的中心画一条线,这条线显然把两个矩形都分成了一半,它们的差当然也是相等的。

    5. 一块矩形的巧克力,初始时由N x M个小块组成。每一次你只能把一块巧克力掰成两个小矩形。最少需要几次才能把它们掰成N x M块1×1的小巧克力?
    答案:N x M – 1次显然足够了。这个数目也是必需的,因为每掰一次后当前巧克力的块数只能增加一,把巧克力分成N x M块当然需要至少掰N x M – 1次。
Read more…

另类思维训练:你能想出这样的词吗?

    我承认我确实N久没更新了,整天写那个该死的现文史论文。昨天终于写完了,休息一下,今天又来更新~~
    中文系里的课程也有比较科学的,我觉得现代汉语是所有中文系必修课程中最科学的课。上学期讲完语音后,这学期进入了语法部分。我一直想写一点与语言学相关的东西,骗些理科小MM来这个专业玩。这里先说一些最近几次课上比较有趣的东西,一些比较系统的汉语语言学小知识留着以后再说吧。下次课我们可能还会学到一些类似的东西,到时候我接着在这儿更新。
    下面是一些有趣的题目,它们可以从另一个角度来考验你的思维能力。先不忙着看答案,看你能想出多少来。

1. 找一个动词,它前面不能加“不”
2. 找一个动词,它前面不能加“没”
3. 找一个动词,它前面既不能加“不”,也不能加“没”
4. 找一个动词,它后面不能加助词“着”、“了”、“过”
5. 找一个动词,它前面可以直接加“很”来修饰
6. 找一个形容词,它前面不能加“不”
7. 找一个形容词,它前面不能加“很”
8. 找一个形容词,它不能直接用作定语
9. 找一个形容词,它不能重叠使用(如“高高的”、“高高兴兴的”)
10. 找一个名词,它前面不能加数量词来修饰
11. 找一个名词,它不能用作主语
12. 找一个名词,它不能用作宾语
13. 找一个名词,它后面可以加上“地”用作状语
14. 找一个名词,它可以直接用作状语(不加“地”)
Read more…

趣题:鸽笼原理的应用 IMO 2001 Problem #3

    IMO 2001第三题:21个女生和21个男生一起参加了一场数学竞赛。结果显示,每个参赛者最多做对了6道题,并且对于任一对男生和女生,至少有一道他们都做对了的题。
    求证:存在这样的一道题,至少有三个女生和三个男生同时做对。

    当然,这个题目背景无趣而又生硬。如果是我的话,我肯定会把题目改成下面这个样子:21个女生和21个男生参加速配游戏,每个人独立地在自己的纸上写下不超过6种兴趣爱好。结果显示,对于任一对男女,他们都写下了至少一个相同的爱好。求证,存在某一个兴趣爱好,有至少三男三女都把它写上了。

    我是一个忠实于原题的好娃娃,因此还是用数学竞赛来当题目背景。对于每个问题,如果有至少3个男生答对了,就给这个问题添加一个标记“B”;如果有至少3个女生答对了,就给这个问题添加一个标记“G”。然后我们画一张21×21的表格,横行代表男生,纵列代表女生。每一个格子都代表一道对应的男女同时做对的题(不同的格子可能对应相同的题目),我们把对应的题目的“B”、“G”标记填进格子里。
    下面我们说明,每一横行里至少有11个格子标了“G”,每一个纵列里至少有11个格子标了“B”。考虑某一个特定的人,他(她)与每一个异性参赛者都有同时答对的题目,但他(她)自己最多只做出6道题。这6道题目需要“分配”给21个异性参赛者。我们希望知道最多有多少道题被不超过2个异性参赛者答对。显然,最极端的情况就是其中的5道题目每道分别被2个异性做对,剩下的第6道题被其余11个异性做对。反过来这也就是被至少三个人答对的题目最少的情况,因此每一行(列)里都有至少11个格子标有异性的标记。
    这样,我们就有了至少21*11个标有“G”的格子,和至少21*11个标有“B”的格子。但21*11*2 > 21*21,因此总有一个格子被同时标上了“G”和“B”。

来源:http://www.cut-the-knot.org/pigeonhole/BoysGirlsProblems.shtml