其他分享
首页 > 其他分享> > (LightOJ - 1342)Aladdin and the Magical Sticks(概率DP)

(LightOJ - 1342)Aladdin and the Magical Sticks(概率DP)

作者:互联网

题目链接: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;
}

 

标签:识别,Sticks,Aladdin,1342,木棍,棍子,权值,include,抽到
来源: https://blog.csdn.net/AC__dream/article/details/120977737