Benelux Algorithm Programming Contest 2019 L. Lucky Draw 概率题

由于输出概率是要求精度1e-6内即可。

这是个无穷次实验。我们可以设置实验轮数。

由于20次一个人一条命不死的概率是1e-12 基本相当于必死。

我们让轮数为50*20,那么每个人相当于必定50条命都死完。

然后就是概率论的题目了。

某个人赢的概率是:i轮这个人死,其他人在i轮之前死的概率,i取1-n求和。

平的概率就是1减去n个人赢的概率。

以后碰到输出精度,要考虑下近似的 问题,。

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,-1,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
/*
10轮不死一条命的概率大约是是  1e-6, 50条命死完维持这个范围是500轮,
如果我们开1000轮,游戏进行1001轮的概率1e-12,相当于不会进行1001轮游戏就会结束 
平局相当与   总情况-赢的概率
每个人的k相同,赢得概率都相同,我们只需要算一个人1000轮后恰好赢的概率 
相当与其他n-1个前999轮死,那个人前999轮死k-1条命
 
*/ 
ld C[1010][1010];
void pre()//n中选m个
{
	int n=1000;
	C[0][0]=1;
	for(int i=1;i<=n;i++)
	{
		C[i][0]=1;
		for(int j=1;j<=i;j++)
			C[i][j]=C[i-1][j]+C[i-1][j-1];
	}
} 
int main()
{
	ios::sync_with_stdio(false);
  	cin.tie(0);
  	int n,k;
	ld p,fp;
  	pre();
  	cin>>n>>k>>p;
  	ld ans=0;
  	ld z=0;//计算第i轮恰好死完 的概率和 
  	//某人赢 的概率就是 某人在第i轮死亡其他人在i轮之前死亡的概率和 
	for(int i=1;i<=1000;i++)//某一个人在第i轮恰好赢的概率 
	{
		if(i<k)continue;
		ld tp=C[i-1][k-1]*pow(p,i-k)*pow(1-p,k);//某人恰好在第i轮死亡 
		ans+=(tp*pow(z,n-1)); //某人在第i轮死亡,其他人在i轮之前死亡 
		z+=tp;//加上第i轮死亡的概率 
	}
	ans=1-ans*n;
	printf("%.10Lf\n",ans);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值