http://www.tianya.cn/techforum/Content/71/535787.shtml
天涯上给出了方法,但是我觉得说得并不完备,也就是不能证明其充要性,故而于此,在它的基础上给出我的方法。
投票,甲得 M,乙得 N,票一张一张计,求计票过程中甲始终领先乙的概率(M>N)。
既无法一一枚举,故而简化之,以六票分甲四乙二为例。
甲票标为 A,乙票标为 B,枚举所有情况:AAAABB、AAABAB、AAABBA、AABAAB、AABABA、AABBAA、……不再枚举,因为从 AABBAA 开始,已经不能满足甲始终领先了。
做如下操作:从左往右遍历,做压栈处理,一旦栈顶处 A 与 B 相遇,则双双弹出栈,若遍历过程中栈终始不为空,则满足条件,否则,不满足条件。
如是操作之道理:相遇的 AB 互相抵消,对甲的领先没有任何影响。若遍历过程中栈内始终不为空,表示始终有未被抵销的票;由于甲乙交替领先权的一个必要条件就是计票过程中栈被清空,也即需要完全抵销对方的优势才可,故而又由于最终甲胜,栈内必然始终不得为空,留下的一定是甲票。
我们将上述枚举处理一下,抵消者以 X 代替,则有 AAXXXX、AAXXXX、AXXXXA、AXXAXX、AXXXXA、XXXXAA、……凡是第一个为 X 者,则表示栈被清空过,因此我们需要序列的第一项为 A。
换种思路:让序列的首尾相连成圈,然后在某一处切断它,形成一种序列。由于有 M + N 个结点,因此有 M + N 种断法。假设从圆外向圆内切,下刀的右侧为新序列起始点,左侧为末尾点。注意这里,会形成许多种圈,比如 AAXXXX、AXXAXX 就是两种圈,分别是两个 A 相连和不相连。但无论有多少种圈,只有从圆外向圆内切,切在 A 的左侧断链,才能保证新序列第一项为 A,由于圆内总共有 M - N 个 A,故每种圆都有 M - N 种切法。故而,概率为 (R*( M - N )) / (R*( M + N ))。R 为圆的种数,可将 R 上下消元,得最后结果为
( M - N ) / ( M + N )
有志于学,虽草庐中应可知天下事!