当前位置: 首页 > 知识库问答 >
问题:

竞争规划算法Sock图概率问题

汤念
2023-03-14

先让我把问题贴上。

这个问题是基于一个(几乎)真实的故事。一个无名的孩子有一大堆干净的袜子。这一堆包含了m双有图片和图案的袜子和n只纯白的袜子。每双袜子由两只相同的袜子组成,每一双都是独一无二的--没有两双看起来是一样的。所有纯白的袜子都是一样的。每天,孩子们从袜子堆里随机挑选两只,穿上,然后去上学。但今天是照相日,孩子需要穿两只一模一样的袜子。于是孩子随机挑选了两只袜子,如果两只袜子都一样,孩子就穿上它们走出家门。如果两只袜子不完全相同,孩子就把袜子扔进洗衣篮里(它们现在很脏--不要问为什么),继续同样的过程,从剩余的干净袜子堆里随机挑选两只袜子。随着这一过程的继续,家长们开始担心:这个孩子今天还能上学吗?请帮助他们计算孩子在这个过程中找不到一双相同袜子的概率。这个问题是基于一个(几乎)真实的故事。

首先,限制是n<=500双袜子,m<=200只白袜子。我真的尽我所能去解决问题。我用了7的排列!然后数成对的袜子。在测试问题,有3个白色和2对袜子。我只能把所有成对的袜子数成7来解决这个问题!排列。这是O(n^n)而且效率很低。你能帮我解决这个问题吗?我顺便用了python,这是一个竞争性编程问题。

在最初的测试答案,有3个白袜子和2个配对袜子(共7只袜子)。答案是:0.457142857142857

共有1个答案

叶英哲
2023-03-14

高级策略:另一种看待问题的方法是,孩子拉出一双袜子,直到剩下零双或一双,然后检查匹配的一双。计算Pr(没有对是白匹配)和Pr(没有对是图案化匹配没有对是白匹配),然后使用概率101计算答案。

Pr(没有一对是白匹配):保证白匹配当且仅当m+2≥2n。 如果m+2<2n,则没有一对是白匹配当且仅当恰好有m对正好有一只白袜子,或者m为奇数且恰好有m−1对正好有一只白袜子且剩的袜子是白的。

在此计算中,将图案袜子视为不可区分的。有(m+2n)选择m种方法画袜子。当m为偶数时,将绘制没有白袜子的袜子的方法数计算为(m/2+n)选择m种方法来选择有白袜子的袜子乘以2m种方法来绘制那些袜子。当m为奇数时,我们得到(((m−1)/2+n)选择(m−1))×2m-1种方式,其中剩袜为白色,加上((m−1)/2选择m)×2m种方式,其中剩袜为图案。

Pr(no pair is a patterned match no pair is a white match):我将处理m为偶数的情况,而将另一种情况留给您或其他人处理。我们有m/2+n对,其中m正好包含一只白色袜子,所以n−m/2对有两只图案袜子。匹配模式子集上的包含-排除给出了交替和

        i                    1            1                  1
 ∑  (−1)  (m choose i) (---------- × ---------- × … × ---------------)
i≥0                     2n + m − 1   2n + m - 3       2n + m - 2i + 1

其中,m choose i是选择i模式的方式数,乘积是所有i都匹配的概率(对于每个模式,我们按一定顺序显示第一只袜子,然后计算其配偶匹配的概率)。

奇数情况的工作原理类似,只是和前面一样,我们根据剩袜子是否是白色的情况拆分为几个情况。

 类似资料:
  • 我目前正在学习动态编程,我无法解决这个问题。有人能给我一个算法吗?:考虑一个有向图G=(V,E),其中每个边都标有一个字母Sigma的字符,我们指定一个特殊的顶点s作为开始顶点,另一个f作为最后顶点。我们说G接受一个字符串a=a1a2。如果有一条从s到f的n条边的路径,其标号拼写为序列a。设计了一个O((V+E)n)动态规划算法来确定a是否被G接受。

  • 问题内容: (注意:这是针对MS SQL Server的) 假设您有一个具有主键标识列和CODE列的表ABC。我们希望此处的每一行都有一个唯一的,顺序生成的代码(基于一些典型的校验位公式)。 假设您有另一个仅具有一行的表DEF,该表存储下一个可用的CODE(想象一个简单的自动编号)。 我知道像下面这样的逻辑将呈现一种竞争状态,其中两个用户可能最终得到相同的CODE: 我知道,两个用户可能会卡在步骤

  • 问题内容: 我在Google App Engine中遇到争用问题,并尝试了解发生了什么。 我有一个注释为的请求处理程序: ..并且在该代码中,我获取了一些东西,更新了其他东西,等等。但是有时在请求期间日志中会出现这样的错误: ..之后是堆栈跟踪。如果需要,我可以使用整个堆栈跟踪进行更新,但这有点长。 我不明白为什么会这样。查看我的代码行中的异常,我在一个完全不同的实体(Round)上运行。错误消息

  • 9.1. 竞争条件 在一个线性(就是说只有一个goroutine的)的程序中,程序的执行顺序只由程序的逻辑来决定。例如,我们有一段语句序列,第一个在第二个之前(废话),以此类推。在有两个或更多goroutine的程序中,每一个goroutine内的语句也是按照既定的顺序去执行的,但是一般情况下我们没法去知道分别位于两个goroutine的事件x和y的执行顺序,x是在y之前还是之后还是同时发生是没法

  • 主要内容:动态规划算法的实际应用动态规划算法解决问题的过程和分治算法类似,也是先将问题拆分成多个简单的小问题,通过逐一解决这些小问题找到整个问题的答案。不同之处在于,分治算法拆分出的小问题之间是相互独立的,而动态规划算法拆分出的小问题之间相互关联,例如要想解决问题 A,必须先解决问题 B 和 C。 《贪心算法》一节中,给大家举过一个例子,假设有 1、7、10 这 3 种面值的纸币,每种纸币使用的数量不限,要求用尽可能少的纸币拼凑

  • 我正在Hackerrank上实现图形算法。 问题陈述: HackerLand的统治者认为该国的每个公民都应该可以访问图书馆。不幸的是,HackerLand被龙卷风袭击,摧毁了所有图书馆并阻碍了道路!由于您是HackerLand最伟大的程序员,统治者希望您帮助修复道路并有效地建造一些新图书馆。 HackerLand有n个城市,编号从1到n。这些城市由m条双向道路连接。如果: 他们的城市有一个图书馆。