概率dp lightoj 1342

题意:有N根木棍,每根木棍都有一个权值 其中有若干根可识别,若干根不可识别的,抽到了可识别的棍子,就不放回,抽到了不可识别的,就要放回 ,问所有棍子都至少被抽过一次后权值和的期望

不可识别的棍子,就相当于投掷一个质地均匀的骰子,问每一个面至少出现一次的期望投掷次数;

而这道题用到的是每一个权值出现的次数,故将期望投掷次数除以总的个数,就是个别的期望投掷次数;

 1 #include <vector>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 #include <iostream>
 6 #include <algorithm>
 7 using namespace std;
 8 double f[5005];
 9 int main(){
10     double ans;
11     int i,j,n,x,y,t,cas;
12     f[0]=0;
13     for(i=1;i<=5000;i++)
14     f[i]=f[i-1]+1.0/i;
15     scanf("%d",&t);                             //有标记过的木棍一定只被抽到一次
16     for(cas=1;cas<=t;cas++){                    //而剩下的就情况就是论文题,如果
17         scanf("%d",&n);                         //权值都为1,那么每个木棍的期望为
18         ans=0;                                  //1/1+1/2+1/3+...+1/n
19         for(i=1;i<=n;i++){                      //有权值后则每根木棍再乘上权值
20             scanf("%d%d",&x,&y);
21             if(y==1)
22             ans+=x;
23             else
24             ans+=x*f[n];
25         }
26         printf("Case %d: %.5lf\n",cas,ans);
27     }
28     return 0;
29 }

猜你喜欢

转载自www.cnblogs.com/pangbi/p/11614270.html