Take Your Seat「疯子坐飞机」

2019-09-26  本文已影响0人  雨落八千里

题意:

  • 有n个人坐飞机,其中有一个疯子,疯子第一个登上飞机,于是他随机的选择一个位置坐下,后面的人会按照自己的顺序坐下,但是他发现自己的位置被占了之后他会随机的在剩余的位子中随机坐下。问最后一个人能够正确坐在自己位置的概率是多少。

思路:

  • 疯子第一个登上飞机,假如他坐在1号位,那后面的人都能坐对。但是他坐在最后一个位置,那么最后一个人一定不能坐在自己的位置上。但是(2~n-1)号都能坐对。
  • 疯子第一个登上飞机,假如他坐在k号位,那么(2~k-1)号都能坐对。当k号登上飞机时,发现自己的位置被占了。于是现在的k号相当于原来的1号,而且对于后面的疯子坐对的位置都是1号位。
    当n=1时 P_1=1;
    当n=2时 P_2=0.5;
    当n=3时 疯子选了1号位 P=1;疯子选了3号位P=0;疯子选了2号位,2号成为新疯子,于是剩下两个位置P=P_2=0.5;
    P_3=(1+0.5+0)/3=0.5;
    .......
    P_n=(P_1+P_2+...+P_{n-1})/n=0.5

Take Your Seat

题意:

  • n个人去坐飞机,他们按照1~n的顺序上飞机,其中只有一个人把自己的号码牌给丢失了,他不记得自己应该坐在哪里。
  • 问题1:当丢失了号码牌的人第一个上飞机,输出第n个人坐在n号位的概率
  • 问题2:当丢失了号码牌的人可以随机(第K个,他对应的座位号是第K号)上飞机 ,输出第n个人坐在第n号位的概率

思路:

  • 问题1:疯子坐飞机问题
  • 问题2:疯子第1个上飞机答案就是对应n个人的疯子坐飞机问题,当他第K个上飞机,前面的1~K-1全部坐对了。剩下的就对应(n-K+1)个人的疯子坐飞机问题
    P_n=P_n+P_{n-1}+...+P_2+P_1=(0.5*(n-1)+1)/m=(m+1)/2m
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int main( )
{
    int t,q=0;
    scanf("%d",&t);
    while(t--)
    {
        q++;
        scanf("%d%d",&n,&m);
        printf("Case #%d: %.6lf %.6lf\n",q,n==1?1.0:0.5,(m*1.0+1)/(2*m));
    }
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读