题目链接:Aladdin and the Magical Sticks - LightOJ 1342 - Virtual Judge (ppsucxtt.cn)
题意:有N根木棍,每根木棍都有一个权值 其中有一些木棍可识别,另一些木棍不可识别的,抽到了可识别的棍子,就不放回,抽到了不可识别的,就要放回 ,问所有棍子都至少被抽过一次后权值和的期望。
我们之前做过这么一道题目:有一个n面骰子,问我们所有面都被骰出的期望值是多少,这道题其实和那道题目差不多,但是有一点差别就是可识别的棍子被抽到后不放回,我们可以这样想,即使是可识别的棍子抽到后也要放回,只是他的权值只会被计算一次,这样的话所有的棍子出现的次数期望都是(n/1+n/2+……+n/n),我们只是把可识别的棍子的权值贡献直接相加,而把不可识别的棍子的贡献乘以他出现的次数期望后再计入答案,这样就可以得到最后的权值和的期望了。
下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int T,n;
cin>>T;
for(int o=1;o<=T;o++)
{
//cnt记录有多少个不可识别的棍子
long long cnt=0;
double ans=0,ans2=0;
scanf("%d",&n);
int t,b;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t,&b);
if(b==1) ans+=t;
else cnt++,ans2+=t;
}
double temp=0;
for(int i=1;i<=n;i++)
temp+=1.0*cnt/i;
if(cnt!=0)
ans+=temp*ans2/cnt;
printf("Case %d: %.10lf\n",o,ans);
}
return 0;
}