朵哈要坐飞机去旅游,出发的时候有包括朵哈在内一共有 n 个人要上飞机。这班飞机有 n 个座位, 第 i 个人的座位号是 i,朵哈的座位号就是 1。 现在 n 个人按照座位号是 1 到 n 的顺序上飞机。但朵哈忘了自己的座位,于是她就等概率随机选一 个位置坐下了。而其余人都记得自己的座位。如果他们中的一个人上飞机后发现自己的位子被占了,则会 在剩下的位置中等概率随机选一个坐下;如果没被占,则会直接坐在自己的位置上。 你需要计算最后一个上飞机的人坐到了自己位置上的概率。 朵哈返程的时候,包括她在内的 m 个人会按照一个随机的座位号顺序上飞机。 Page 2 of 7 本文仅为中文简述!更多相关细节(包括数据规模,样例以及样例说明)请参见原题 这班飞机有 m 个座位,朵哈的座位号还是 1。但是朵哈又一次忘记了自己的座位,且只有她忘记了 自己的座位。现在所有人找座位的规则和出发时完全相同:朵哈或任何一个发现自己座位已经被占了的 人会等概率随机选一个没被占的座位坐下。 你需要计算最后一个上飞机的人坐到了自己位置上的概率。
输入格式
第一行包含一个整数 T,表示测试数据的组数。 接下来 T 行,每行描述一组测试数据,包含两个整数 n 和 m,分别表示出发时和返程时上飞机的人 数。
1
2 3
输出格式
对于每组测试数据,输出一行信息 "Case #x: y z"(不含引号),其中 x 表示这是第 x 组测试数 据,y 表示出发时最后一个人坐到了自己位置上的概率,z 表示返程时最后一个人坐到了自己位置上的概 率,四舍五入精确到小数点后 6 位,数据保证答案的小数点后第 7 位不是 4 或 5。
Case #1: 0.500000 0.666667
思路:第一种情况下,假设n==1时,概率为1,当n==2时概率为1/2,当n>=3时,假设1号目标坐在了k位置上那么2到k-1都会做好,剩下就是讨论n-k+1的人然后就会得到递推公式fn=(f1+f2+f3+...+fn-1)/n然后发现只要n>=2得出来的结果都是1/2。。。。。。
第二种情况下,1号目标第k个上车那么他前面的前k-1个人都已经坐好了,所以说每个人一上车都不确定是不是可以看成是第一种的情况 所以说fm=(1+1/2*(m-1))/m=(1+m)/2*m;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
int n,m;
int k=1;
double ans1,ans2;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(n==1)
ans1=1;
else
ans1=0.5;
ans2=(double)(m+1)/(double)(2*m);
printf("Case #%d: %lf %lf\n",k,ans1,ans2);
k++;
}
return 0;
}