【题目】
题目描述:
在成都某中学有 个男生与 个女生排队,这个学校的女生比较古怪,从某个位置(包含这个位置)开始往前数,男生的数量超过了女生的数量,女生会感觉不安全,于是会大叫起来,为了构建和谐校园,安排队伍时应该避免这样的情况。请你计算出不会引发尖叫的排队方案的概率。(排队方案不同定义:当且仅当某个某个位置人不一样,如男生 A、男生 B ,与男生 B、男生 A ,2 个排列是不同方案)
输入格式:
第一行 1 个整数, 表示测试数据的组数。
每个数据 有两个数 , ( 个女生, 个男生)
输出格式:
对于每组数据,输出一个实数(保留到小数点后 6 位)
样例数据:
输入
3 1 0 0 1 1 1
输出
1.000000 0.000000 0.500000
备注:
【样例解释】
第一组:只有一个女生,一种方案且可行
第二组:只有一个男生,一种方案且不行
第三组:两种方案女、男可行,男、女不可行,可行概率 0.5
【数据规模】
30%的数据: 测试组数 ≤ 10,0 ≤ , ≤ 1000
100%的数据: 测试组数 = 9008,0 ≤ , ≤ 20000
【分析】
找规律找到的满分。。。
先说一下答案,答案其实找规律很容易找出来,要按以下两种情况分类:
- 当 < 时,
- 当 ≥ 时,
对于情况 1,很容易可以看出来,直接来说情况 2 吧。
我们可以将原问题转化一下,看成是在一个二维平面上行走,女生看成移动(1,0),男生看成移动(0,1),那么到达(N,M)点且路线又不走到 这条直线上方的路线总数就是答案,这个组合问题很经典,总方案数为 ,不合法的是 ,减掉之后就得到
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
// freopen("fseq.in","r",stdin);
// freopen("fseq.out","w",stdout);
int n,m,i,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(m>n) printf("0.000000\n");
else printf("%.6lf\n",1.0*(n-m+1)/(n+1));
}
// fclose(stdin);
// fclose(stdout);
return 0;
}