考虑只有两人的情况,我们称为a和b吧!此时很明显,只要a坐到了正确的位置,那么b也能坐到正确的位置,概率是0.5.
考虑三人的情况。我们称为a,b和c三个人。此时,对a来说,有三种选择:
1.坐到了第一个位置,此时是正确的位置,所有人都可以坐到正确的位置,这种情况发生的概率是1/3
2.坐到了第三个位置,此时,对c来说,绝对不可能再坐到自己的位置上了,这种情况发生的概率是1/3
至此,我们可以明确,c在正确的位置上的概率为1/3到2/3之间,接下来看第三种情况:
3.坐到了第二个位置。此时就剩下两个位置了,对于b来说,他所面临的情况是:
第一、现在座位只有两个。
第二、站在上帝视角,对我们来说,他的正确的位置是一号位置(因为一号位置是a的,但是a现在在二号位置,我们可以理解为把a和b的位置对调了。或者也可以理解为,只有当b坐到了一号位置,其余的所有人才都能坐到正确的位置)
第三、对他来说,他不知道自己的正确位置在哪,所以他可以随便坐位置
我们很惊喜的发现,这种情况不就是上文提到的只有两人的情况嘛!此时,b就是只有a和b情况下的a,而c就是只有a和b情况下的b。那么在这种情况下,c坐到正确位置的概率是多少?没错!上文已经给出了,是0.5.
至此,我们可以算出,在有三个人的情况下,c坐到正确的位置的概率是:
接着下去呢?有四个人的话,怎么办呢?此时,我们还是继续慢慢推理,继续称呼他们是a,b,c,d:
考虑a的情况:
1.他有1/4的概率坐到了正确的位置,此时所有人都可以坐到正确的位置
2.他有1/4的概率,坐到了四号位置,此时,d绝对不可能坐到正确的位置
3.他有2/4的概率,坐到了二号和三号位置,取坐到了二号位置进行讨论:
此时对b来说,他所面临的情况是:
第一、现在座位只有三个。
第二、站在上帝视角,对我们来说,他的正确的位置是一号位置
第三、对他来说,他不知道自己的正确位置在哪,所以他可以随便坐位置
还是一样的,把b当a,把c当b,把d当c,此时,就是只有a,b,c三个人的 情况下,c能坐到正确的位置的概率,这个概率不就是我们已经计算过的1/2嘛!
所以,我们可以得到,四个人的情况下,d能坐到四号位置的概率是:
至此,你已经发现概率了,假设p(n)表示n个人的情况下,第n个人能坐到第n号位置的概率。那么,可以写出递推公式:.,其中,当n=1时,p(n)=1。当n=2时,p(n)=0.5
c++AC代码:
class Solution {
public:
double nthPersonGetsNthSeat(int n) {
if(n==1) return 1;
auto dfs=[&](auto&& dfs,int n)->double{
if(n==1) return 1;
if(n==2) return 0.5;
return (double)1/n+((double)(n-2)/n)*dfs(dfs,n-1);
};
return dfs(dfs,n);
}
};
当然,你会发现,好像只要n大于等于2,得到的就是0.5,那么代码改成下面这样也是可以过的:
class Solution {
public:
double nthPersonGetsNthSeat(int n) {
return n==1?1:0/5;
}
};
不过笔者确实无法得到一个非常准确无误的只要n>=2,那么p(n)就是0.5的结论,如果有大佬知道如何通过准确的推理得到这个结论,欢迎留言私信,感谢不尽!