Kids and Prizes Gym - 101411K

http://www.aichengxu.com/other/1640203.htm

题目大意: N个奖品,M个人,求被给出去的奖品数量的期望。

对于M个人来说,拿到奖品的概率为Y[i],不拿到奖品的概率为N[i], 因为这两个事件是对立的,所以 N[i]=1-Y[i];

第i个拿到奖品的人概率,可由第i-1个人没拿到奖品和拿到奖品两种状态推出来。

Y[i]=N[i-1]*Y[i-1]+Y[i-1]*(Y[i-1]-1/n);

#include<iostream>
#include<cstdio>
#define maxn 1000005
using namespace std;
double Y[maxn],N[maxn];
int main()
{
    double n,m;
     //freopen("kids.in", "r", stdin);
     //freopen("kids.out", "w", stdout);
    scanf("%lf%lf",&n,&m);
    double ans=1;
    Y[1]=1;
    N[1]=0;
    for(int i=2;i<=m;i++)
    {
        Y[i]=N[i-1]*Y[i-1]+Y[i-1]*(Y[i-1]-1.0/n);
        N[i]=1-Y[i];
        ans+=Y[i];
    }
    printf("%.10f\n",ans);
    return 0;


}

正难则反:求被给出去的奖品数量的期望,就是总数-没给出去的奖品的数量的期望。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
    //freopen("kids.in", "r", stdin);
     //freopen("kids.out", "w", stdout);
    double n,m;
    while( scanf("%lf%lf",&n,&m)!=EOF)
    {
        double p=(n-1)/n;
        double ans=n*(1-pow(p,m));
        printf("%.10f\n",ans);
    }
return 0;
}

 

posted @ 2017-08-03 21:25  Twsc  阅读(329)  评论(0编辑  收藏  举报