【2018/10/04测试T2】【WOJ 4037】排队

【题目】

题目描述:

在成都某中学有 m 个男生与 n 个女生排队,这个学校的女生比较古怪,从某个位置(包含这个位置)开始往前数,男生的数量超过了女生的数量,女生会感觉不安全,于是会大叫起来,为了构建和谐校园,安排队伍时应该避免这样的情况。请你计算出不会引发尖叫的排队方案的概率。(排队方案不同定义:当且仅当某个某个位置人不一样,如男生 A、男生 B ,与男生 B、男生 A ,2 个排列是不同方案)

输入格式:

第一行 1 个整数, 表示测试数据的组数。

每个数据 有两个数 n , mn 个女生,m 个男生)

输出格式:

对于每组数据,输出一个实数(保留到小数点后 6 位)

样例数据:

输入

3
1 0
0 1
1 1

输出

1.000000
0.000000
0.500000

备注:

【样例解释】

第一组:只有一个女生,一种方案且可行

第二组:只有一个男生,一种方案且不行

第三组:两种方案女、男可行,男、女不可行,可行概率 0.5

【数据规模】

30%的数据: 测试组数 ≤ 10,0 ≤ n , m ≤ 1000

100%的数据: 测试组数 = 9008,0 ≤ n , m ≤ 20000

【分析】

找规律找到的满分。。。

先说一下答案,答案就是 (n-m+1)/(n+1),找规律很容易找出来

可以将原问题转化一下,看成是在一个二维平面上行走,女生看成移动(1,0),男生看成移动(0,1),那么到达(N,M)点且路线又不走到 y=x 这条直线上方的路线总数就是答案,这个组合问题很经典,方案数为 C(M+N,M)-(M+N,M-1),所以可以知道答案就是1-M/(N+1) 

【代码】

#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;
}

猜你喜欢

转载自blog.csdn.net/forever_dreams/article/details/82937376