题意:有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 }