CodeForces 26D Tickets(概率)

题意:有n+m个人要买票,其中n个人拿着10元的钞票,m个人拿着20元的钞票,现在手中有k张10元钞票,每张门票价值10元,问所有人能买到门票的概率。

思路:如果n=m且k为0,那么这道题就退化成了卡特兰数的问题。

现在考虑将所有情况画在一张图上,每个点的x坐标为当前进场人数,y坐标为10元钞票比20元钞票多的数量,所以起点为(0,k),终点为(n+m,n+k-m),总的方案数为C(n+m, n)*n!*m!。

然后考虑不合法的方案数,如果方案不合法,那么折线一定和y=-1有交点,现在考虑折线上最后一个与y=-1的交点,假设这个点为A点,那么从A点以后折线大于等于零的,现在将A点以后的折线以y=-1为对称轴翻折下来,那么终点变为了(n+m,-2+m-n-k),可以发现所有不合法的方案经过翻折都会到达这个终点,所以不合法方案数就是从起点到达新终点的方案数。

#include <bits/stdc++.h>
#define eps 1e-6
#define LL long long
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

//const int MAXN = 5000000 + 5;
//const int MOD = 1e9+7;
//const int INF = 0x3f3f3f3f;
int n, m, k;
int main()
{
	freopen("input.txt", "r", stdin);
	cin >> n >> m >> k;
	if (n+k-m < 0) {
		puts("0");
		return 0;
	}
	double ans = 1.0;
	for (int i = 0; i <= k; i++) 
		ans = ans*(m-i)/(n+i+1);
	ans = 1.0 - ans;
	printf("%.6f", ans);
	return 0;
}
















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值