我是靠谱客的博主 靓丽糖豆,最近开发中收集的这篇文章主要介绍【LightOJ-1104 Birthday Paradox】概率&期望DP,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

LightOJ-1104 Birthday Paradox

题意

经典的生日悖论问题,现在假设一年有n天,问一个生日聚会至少邀请多少人才能保证至少有两个人生日相同的概率不小于0.5

做法

首先我们通过样例大胆猜对于每个n,答案应该很小。之后我们用dp的方法求即可。
dp[i]表示到i个人出现两个人生日相同的概率,首先1-dp[i-1]表示i-1个人没出现两个人生日相同的概率,之后只要第i个人生日和i-1个人中的某一个相同即可,又因为i-1个人的生日两两不同,所以第i个人与i-1个人中的某一个生日相同的概率为 i − 1 n frac{i-1}{n} ni1,于是可以得到转移式:

d p [ i ] = ( 1 − d p [ i − 1 ] ) ∗ i − 1 n + d p [ i − 1 ] dp[i]=(1-dp[i-1])*frac{i-1}{n}+dp[i-1] dp[i]=(1dp[i1])ni1+dp[i1]

最后当dp[i]大于等于0.5跳出即可,注意题目中邀请的人不算自己,所以要减去1输出。

代码


#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const double eps = 1e-8;
int sgn(double x)
{
if(fabs(x)<eps) return 0;
if(x<0) return -1;
return 1;
}
int main()
{
int t;
scanf("%d",&t);
int cas=0;
while(t--)
{
int n;
int ans=1;
scanf("%d",&n);
double tmp=0;
double cc=0;
for(int i=2;;i++)
{
tmp=(1.0-cc)*(1.0*(i-1)/n);
cc=cc+tmp;
if(sgn(cc-0.5)>=0)
{
ans=i;
break;
}
}
printf("Case %d: %dn",++cas,ans-1);
}
return 0;
}

最后

以上就是靓丽糖豆为你收集整理的【LightOJ-1104 Birthday Paradox】概率&期望DP的全部内容,希望文章能够帮你解决【LightOJ-1104 Birthday Paradox】概率&期望DP所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部