题目链接:https://cn.vjudge.net/problem/Gym-102222D
题目大意:题目一共有两问:第一问:有n个人按顺序上飞机,主人公Duha在其中,Duha的编号是1,但是Duha忘了自己是哪个座位,他随机从n个座位找一个座位坐,随后上飞机的人如果发现自己的座被占,他便会在剩余的座位中随即找一个座,问最后一个人做到正确位置的概率是多少?
第二问:n个人不按顺序上飞机,依旧是Duha忘记了位置,因此Duha上飞机后会随机坐,问此时最后一人坐到正确位置的概率是多少?
思路:第一问:读完题便有一个大胆的想法,当n>=2时,概率都是 1/2,(当时想的是最后一个人只有两种情况,对与错),下面来证明一下:
当 n = 1时,Duha肯定能做对,故概率为1.
当 n = 2时,Duha有两种情况选择,一种对,一种错,故概率为1/2;
当 n = 3 时
- 当Duha 选择了自己的位置 ,则后面的乘客都能做到正确的位置 ,此时概率为 1/3;
- 当Duha选择了2位置,则2号上飞机时就会随机选择,只有两个位置可以选(1/2),故最后一位乘客正确的概率 1/3*1/2;
- 当Duha选择了3位置,则3号位置一定是错误的,故概率为0;
故 P(3)=1/3 + 1/3*1/2 + 0 = 1/2;
当 n = 4 时
- 当Duha选对了位置,概率为1/4(同n=3时)
- 当Duha选择了2位置,则2号乘客上车时的状态和Duha时一样的,在n-1个座位中选择 ,则为1/4*P(3);
- 当Duha选择了3位置,则2号乘客能够选对,此时3号乘客的状态与Duha相同,在n-2个座位中选择,则为1/4*P(2);
- 当Duha选择了4位置,则最后一位乘客一定不能做到正确位置,故概率为0;
故 P(4)= 1/4 +1/4*P(3)+ 1/4*P(2)+0 = 1/2;
总结归纳 P(n)=1/n + 1/n * p( n - 1)+1/n * p(n-2)+ …… + 1/n * p(2) +0
=1/n + 1/2 *1/n*(n-2) = 1/2;
故当n=1时 P = 1 ; 当 n >1 时,P =1/2;(当时做题时直接莽过去了,也没证明)
第二问:乘客乱序上飞机,则乘客在Duha上飞机前上飞机前上都能做到正确位置,则剩下的人为n-i(i为Duha上之前已经上的人数),又回到了第一问的情况,P(n-i+1),则每种i的概率为 1/n ,则总的概率为 1/n *(P(1)+P(2) + P(2)+……+P(n) )= 1/n *(1 + (n-2)*1/2)= (n+1)/2m (做题时队友玄学推出公式,tql)
官方题解附图(另一种解释)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
int Case =1;
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
printf("Case #%d: %.6lf %.6lf\n",Case++,n==1?1:0.5,m==1?1:1.0*(m+1)/2/m);
}
return 0;
}