【NOIP校内模拟】排队

【题意】
在成都某中学有 m 个男生与 n 个女生排队,这个学校的女生比较古怪,从某个位
置(包含这个位置)开始往前数,男生的数量超过了女生的数量,女生会感觉不安全,于
是会大叫起来,为了构建和谐校园,安排队伍时应该避免这样的情况。请你计算出不会引
发尖叫的排队方案的概率。(排队方案不同定义:当且仅当某个某个位置人不一样,如男
生A、男生B ,与男生B、男生A ,2个排列是不同方案)
【 Input】
第一行1个整数, 表示测试数据的组数。
每个数据 有两个数 N,M(N个女生,M个男生)
【 Output】
对于每组数据,输出一个实数(保留到小数点后 6 位)
【 Sample Input】
3
1 0
0 1
1 1
【 Sample Output】
1.000000
0.000000
0.500000

听说是一个原题 SCOI2010生成字符串

如果直接用数学方法做看起来并不好做,转换一下;

在一个平面直角坐标系中,从点(0,0)到点(n + m,n - m),

一个女生相当于从(0,0)向(1,1)的方向走,一个男生相当于(0,0)向(1,-1)的方向走,同时不能走到直线y = -1上

由于n个1,m个0必然要走到(n + m, n - m),求方案数,

先考虑没有限制条件的,可以发现n个1是必须取完的一共要取n + m个数,

那么要在n + m个数中取n个数,自然方案数就是C(n + m,n),

那么我们怎么求出不符合条件的方案数呢?

可以想象一下把直线y = -1上面的翻折下来,即从点(0,-2)到点(n + m, n - m)经过直线y = -1的方案数,显而易见,肯定经过直线y=-1,

走到(n+m,n-m)需要向上走n-m+2次,一共要走n+m次。设向上向下各走x,y,那么x+y=n+m,x-y=n-m+2得到x=n+1,y=m-1,所以不合法的方案为C(n+m,n + 1)。

然后约分 就一句话了

#include<bits/stdc++.h>
using namespace std;
int T;
double n,m;
int main()
{
	//QWQQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQWQ
	freopen("fseq.in","r",stdin);
	freopen("fseq.out","w",stdout);
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		if(m>n)	puts("0.000000");
		else cout<<fixed<<setprecision(6)<<(n-m+1)/(n+1)<<'\n';
	}
	return 0;
} 
posted @ 2018-10-04 15:04  Patrickpwq  阅读(200)  评论(0编辑  收藏  举报